C++ специализированный шаблон наследовался неспециализированной версии

Я пытался решить проблему, но нашел другое решение. однако из любопытства любят знать, возможно ли следующее:

template< class > struct S;
template< > struct S< Foo > : struct< Foo > {};

Я хотел бы смочь наследоваться, неспециализированная структура от специализированного struct.the примера выше не работает, потому что наследованная структура является специализированным, ведя к бесконечной рекурсии.

Одно возможное решение состояло в том, чтобы добавить второй шаблонный параметр, сказать bool, специализированный, такой, что значение по умолчанию является ложью, и специализированный шаблон имеет тот параметр, true.however, который делает вещи немного грязными, так как инстанцирование должно указать дополнительный параметр.

Есть ли некоторый другой путь вокруг для реализации вышеупомянутого?

исходная проблема состояла в том, чтобы реализовать матрицу матриц, где сама матрица может иметь дополнительные операторы, завися, если составляющие матрицы имеют те операторы. Я надеялся бы, что это имеет смысл. одновременно другая специализированная матричная потребность быть того же базового класса, одновременно сохраняющего то же имя, хотя с различными шаблонными параметрами. Я думал, что мог бы быть способ сделать это с помощью enable_if и черты типа

7
задан Anycorn 13 January 2010 в 20:35
поделиться

2 ответа

Вы можете сохранить все общие вещи в отдельном типе и продлиться с вашей специализацией:

template <typename> struct S_generic { /* generic stuff here */ };

template <typename T> struct S : public S_generic<T> { /* nothing here */ };
template <> struct S<Foo> : public S_generic<Foo> { /* extra stuff here */ };

Редактировать : в альтернативно, если вам не нравится дополнительное имя, Способ использования дополнительного флага без ощупывания при создании шаблона является использование значения по умолчанию:

template <typename T, bool fully_defined=true> struct S;
template <typename T> struct S<T,false> { /* generic stuff here */ };

template <typename T> struct S<T,true> : public S<T,false> {};
template <> struct S<Foo,true> : public S<Foo,false> { /* extra stuff here */ };
5
ответ дан 7 December 2019 в 07:45
поделиться

Одно возможное решение состояло в том, чтобы добавить второй шаблонный параметр, сказать bool, специализированный, такой, что значение по умолчанию является ложью, и специализированный шаблон имеет тот параметр, true.however, который делает вещи немного грязными, так как инстанцирование должно указать дополнительный параметр.

можно сделать шаблон <класс Foo, bool флаг = ложь> , таким образом, второй параметр является дополнительным.

2
ответ дан 7 December 2019 в 07:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: