静态鸭子打字与CRTP

时间:2014-08-29 10:54:31

标签: c++ polymorphism

这是来自Static polymorphism in C++

的后续问题
  • 我什么时候应该选择鸭子打字?

  • 我应该何时更喜欢CRTP?

  • 是否有最佳做法?

归结为:

template<typename T>
void print_renderer(const renderer<T> &r){
    r.get();
}

vs

template<typename T>
void print_renderer(const T &r){
    static_assert(is_renderer<T>,"Not a renderer");
    r.get();
}

到目前为止我所观察到的:

  • CRTP不像运行时多态一样好用。要创建多态接口,只需使用virtualoverride。这两个关键字都不能与CTRP一起使用。如果我在实现中有拼写错误,则会触发运行时错误。 (也许这可以预防)

  • 鸭子打字很简单,但可能会让我的客户感到困惑。如果他们无法访问源代码并且必须使用void print_renderer(T r) vs void print_renderer(renderer<T> r),我认为CRTP更清晰。

  • 鸭子打字确实有维持成本。在我之前的问题中,我为渲染器创建了open_gldirect_draw实现。如果我想添加另一个渲染器,例如open_gl_es,我还需要更改我的is_renderer<T>功能。但我认为这不会太糟糕。

1 个答案:

答案 0 :(得分:2)

首选代码示例,您可以首选代码renderer<T>。你在第二个代码示例中所做的基本上是自己重新实现重载决策规则。