c – 静态鸭子打字与CRTP

这是
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不如运行时多态性好.要创建多态接口,有人只需要使用虚拟和覆盖.这两个关键字都不能与CTRP一起使用.如果我在实现中有拼写错误,则会触发运行时错误. (也许这可以预防)
>鸭子打字很简单,但它可能会让我的客户感到困惑.如果他们无法访问源代码并且他们必须使用void print_renderer(T r)vs void print_renderer(renderer< T> r),我认为CRTP更清晰.
>鸭子打字确实有维持成本.在我之前的问题中,我为渲染器创建了一个open_gl和direct_draw实现.如果我想添加另一个渲染器,例如open_gl_es,我还需要更改我的is_renderer< T>功能.但我认为这不会太糟糕.

最佳答案 您获取渲染器的第一个代码示例< T>作为参考应该是首选.你在第二个代码示例中所做的基本上是自己重新实现重载决策规则.

点赞