【问题标题】:C++ CRTP with parametized base class?具有参数化基类的 C++ CRTP?
【发布时间】:2011-12-12 10:30:47
【问题描述】:

我正在尝试使用 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 将包含狗和猫通用的构造函数和运算符。一种倒置多态,其中基类具有专业化。这样做的原因是为了不必为每个特化重写或转发构造函数和运算符。

【问题讨论】:

  • 你想用这样的设计达到什么目的?
  • 您是否意识到您正在尝试使Base 派生自Derived,而Base 本身又派生自Derived,等等?您可能应该解释您的目标是什么,而不是您如何实现它,以便我们提出替代方案。
  • +1 表示有趣的设计。不确定它会有多大用处

标签: c++ templates crtp


【解决方案1】:

你的编译错误可以这样解决:

Base<Wrapper<Base> >

您忘记了模板参数。

【讨论】:

  • 啊,是的,我确实想过,但假设我必须写Base&lt;Wrapper&lt;Base&lt;Wrapper&lt;Base&lt;Wrapper&lt;Base&lt;Wrapper&lt;...&gt; &gt; &gt; &gt; &gt; &gt; &gt; &gt;
  • @paperjam 只要基础不继承 Wrapper,就不会发生这种情况。
猜你喜欢
  • 2015-07-11
  • 2021-03-30
  • 2021-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多