как закончить слои шаблона? - PullRequest
1 голос
/ 08 августа 2011

При наличии:

template <typename Super>
class Whatever : public Super
{
    ...
};

возможно ли создать Whatever класс, не производный от чего-либо?

Это более легкая версия?

struct BlankType{};

Whatever<BlankType> w;

////////////////////////////////////////

Некоторый фон:

Мой код состоит из шаблонных слоев, таких как Whatever выше. Так что я могу сделать:

typedef Whatever<Whenever<Wherever<>>>> MyCombinedType

на самом деле не могу. Я должен сделать

typedef Whatever<Whenever<Wherever<BlankType>>>> MyCombinedType

и тип становится также BlankType. Я не могу сделать Wherever «не слоями», потому что когда я буду делать просто

typedef Whatever<Whenever<>>> MyCombinedType

проблема снова появится ...

Ответы [ 2 ]

9 голосов
/ 08 августа 2011

Если вы хотите создать Whatever класс, который не является производным от чего-либо, вы можете просто определить его спецификацию следующим образом:

class BlankType {};
template<typename T = BlankType> class Whatever : public T {};
template<> class Whatever<BlankType> {};
2 голосов
/ 08 августа 2011

Немного не по теме, в C ++ с переменными шаблонами вы можете избежать рекурсивного создания экземпляров благодаря рекурсивному определению:

template <class ...Bases> class Whatever;

template <class B, class ...Bases>
class Whatever<B, Bases...> : public B, public Whatever<Bases...> { /* ... */ };

template <class B>
class Whatever<B> : public B { /*... */ };

template <> class Whatever<> { /* ... */ };

Теперь вы можете сказать Whatever<Foo, Bar, Baz> и наследовать от всех тех. Если вы также хотите наследовать от нескольких вложенных экземпляров Whatever, вы должны сделать все наследования виртуальными.

Последняя специализация в моем примере также показывает, как вы можете специализировать Whatever, чтобы ничего не происходить. Если вы пишете Whatever<> x;, у вас есть объект класса, который не является производным от чего-либо.

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