Я пытался решить проблему, но нашел другое решение. однако из любопытства любят знать, возможно ли следующее:
template< class > struct S;
template< > struct S< Foo > : struct< Foo > {};
Я хотел бы смочь наследоваться, неспециализированная структура от специализированного struct.the примера выше не работает, потому что наследованная структура является специализированным, ведя к бесконечной рекурсии.
Одно возможное решение состояло в том, чтобы добавить второй шаблонный параметр, сказать bool, специализированный, такой, что значение по умолчанию является ложью, и специализированный шаблон имеет тот параметр, true.however, который делает вещи немного грязными, так как инстанцирование должно указать дополнительный параметр.
Есть ли некоторый другой путь вокруг для реализации вышеупомянутого?
исходная проблема состояла в том, чтобы реализовать матрицу матриц, где сама матрица может иметь дополнительные операторы, завися, если составляющие матрицы имеют те операторы. Я надеялся бы, что это имеет смысл. одновременно другая специализированная матричная потребность быть того же базового класса, одновременно сохраняющего то же имя, хотя с различными шаблонными параметрами. Я думал, что мог бы быть способ сделать это с помощью enable_if и черты типа
Вы можете сохранить все общие вещи в отдельном типе и продлиться с вашей специализацией:
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 */ };
Одно возможное решение состояло в том, чтобы добавить второй шаблонный параметр, сказать bool, специализированный, такой, что значение по умолчанию является ложью, и специализированный шаблон имеет тот параметр, true.however, который делает вещи немного грязными, так как инстанцирование должно указать дополнительный параметр.
можно сделать шаблон <класс Foo, bool флаг = ложь>
, таким образом, второй параметр является дополнительным.