Use Curiously Recurring Template Pattern (CRTP) with additional type parameters

Я пытаюсь использовать шаблон любопытно повторяющегося шаблона (CRTP) и предоставляю дополнительные параметры типа:

template <typename Subclass, typename Int, typename Float>
class Base {
    Int *i;
    Float *f;
};
...

class A : public Base<A, double, int> {
};

Вероятно, это ошибка, более подходящим суперклассом будет Base - хотя это несоответствие порядка аргументов не так очевидно. Эту ошибку было бы легче увидеть, если бы я мог использовать name значение параметров в typedef:

template <typename Subclass>
class Base {
    typename Subclass::Int_t *i;  // error: invalid use of incomplete type ‘class A’
    typename Subclass::Float_t *f;
};

class A : public Base<A> {
    typedef double Int_t;         // error: forward declaration of ‘class A’
    typedef int Double_t;
};

Однако это не компилируется на gcc 4.4, сообщения об ошибках представлены в виде комментариев выше - я думаю, причина в том, что перед созданием A ему необходимо создать экземпляр базового шаблона, но для этого, в свою очередь, необходимо знать A.

Есть ли хороший способ передачи "именованных" параметров шаблона при использовании CRTP?

9
задан hrr 15 April 2011 в 17:25
поделиться