Как класс может наследовать от шаблона на основе самого себя? - PullRequest
10 голосов
/ 01 декабря 2011

Читая статью, я наткнулся на следующий синтаксис:

template <typename T>
class MyTemplate
{
    T* member;
    T* method();
    // ...
}

class MyClass : public MyTemplate<MyClass>
{
    // ...
}

Я не совсем понимаю, как MyClass может наследовать от шаблона, основанного на нем. Не могли бы вы объяснить, как это работает?

Ответы [ 3 ]

9 голосов
/ 01 декабря 2011

Это называется шаблон с любопытством повторяющихся шаблонов , или сокращенно CRTP. Он используется для достижения эффекта статического полиморфизма, используя тот факт, что к тому моменту, когда вы достигнете MyTemplate<MyClass> в строке class MyClass : public MyTemplate<MyClass>, MyClass будет полуопределенным (это неполный тип), так что вы можете храните указатели на этот тип и т. д. и выполняйте с ними действия, не требующие полного типа.

2 голосов
/ 01 декабря 2011

Это называется CRTP.Он используется для статического полиморфизма, который может быть быстрее, чем использование виртуального.

: public MyTemplate<MyClass>

Создает экземпляр MyTemplate<MyClass>, хотя, поскольку MyClass неполон, вы можете использовать T только так, чтобы не требовался полный тип,Например, с помощью указателя или вызова функции-члена.

В любом случае, просто посмотрите на свой фрагмент, по сути, он такой же:

class MyClass
{
    MyClass* member;
    MyClass* method();
}

Это совершенно законно и понятно.

2 голосов
/ 01 декабря 2011

Не могли бы вы объяснить, как это работает?

Хм ... это просто .. делает? Стандарт, в частности, позволяет параметрам шаблона иметь неполный тип. И поскольку ни один метод в базовом классе CRTP не нуждается в полностью определенном типе, все в порядке.

§3.9.2 p3 [basic.compound]
Разрешены указатели на неполные типы, хотя существуют ограничения на то, что с ними можно сделать (3.11).

§14.3.1 p2 [temp.arg.type]
[Примечание: аргумент типа шаблона может быть неполного типа (3.9). —Конечная записка]

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