C ++ специализированный шаблон наследуется от неспециализированной версии - PullRequest
7 голосов
/ 13 января 2010

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

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

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

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

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

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

Ответы [ 2 ]

5 голосов
/ 13 января 2010

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

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 */ };
2 голосов
/ 13 января 2010

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

Вы можете сделать template<class Foo, bool flag = false>, поэтому второй параметр является необязательным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...