这是来自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不像运行时多态一样好用。要创建多态接口,只需使用virtual
和override
。这两个关键字都不能与CTRP一起使用。如果我在实现中有拼写错误,则会触发运行时错误。 (也许这可以预防)
鸭子打字很简单,但可能会让我的客户感到困惑。如果他们无法访问源代码并且必须使用void print_renderer(T r)
vs void print_renderer(renderer<T> r)
,我认为CRTP更清晰。
鸭子打字确实有维持成本。在我之前的问题中,我为渲染器创建了open_gl
和direct_draw
实现。如果我想添加另一个渲染器,例如open_gl_es
,我还需要更改我的is_renderer<T>
功能。但我认为这不会太糟糕。
答案 0 :(得分:2)
首选代码示例,您可以首选代码renderer<T>
。你在第二个代码示例中所做的基本上是自己重新实现重载决策规则。