带参数化基类的C ++ CRTP?

时间:2011-10-21 09:16:29

标签: c++ templates crtp

我正在尝试使用具有小变化的CRTP。我有一个派生类模板,并希望将其应用于多个基类。但这要么不可能,要么我无法正确使用语法。以下代码无法编译,但希望说明我想要实现的目标:

template <class Derived> struct BaseCats { /* ... */ };
template <class Derived> struct BaseDogs { /* ... */ };
// ....
template <class Derived> struct BaseN { /* ... */ };

template <template <class> class Base>
struct Wrapper 
    : 
    Base<Wrapper> // compile error - Wrapper is not a complete type
{
    Wrapper(int n) 
    { 
       // I do not want to rewrite or forward this 
       // constructor or Wrapper's operators
    }
};

typedef Wrapper<BaseCats> Cats;
typedef Wrapper<BaseDogs> Dogs;
// ...
typedef Wrapper<BaseN> MyTypeN;

可以这样做吗?

修改

我想在这里实现什么目标?

我将上面的一些代码重命名为使用“狗和猫”的比喻。可能存在以下功能:

void BaseCats<Derived>::print() const 
{ 
    std::cout << (static_cast<const Derived *>this)->n << " cats\n"; 
}

Wrapper将包含狗和猫共有的构造函数和运算符。一种反向多态,其中基类具有特化。这样做的原因是不需要为每个专业化重写或转发构造函数和运算符。

1 个答案:

答案 0 :(得分:4)

您的编译错误可以通过以下方式解决:

Base<Wrapper<Base> >

你忘记了模板参数。