2014-08-29 56 views
4

这是Static polymorphism in C++静态鸭打字VS CRTP

  • 一个后续的问题。当我应该更喜欢鸭打字?

  • 我应该什么时候更喜欢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>函数。但我认为这不会太糟糕。

+2

请勿使用胶带 - 将其焊接起来。 – 2014-08-29 10:56:12

+0

你的例子不是CRTP。 – Simple 2014-08-29 10:57:23

+0

@Simple我重复使用了我在顶部链接的最初SO问题中的代码。我应该将代码复制到这个代码中吗? – 2014-08-29 10:59:05

回答

2

,你通过引用采取renderer<T>你的第一码样本应当是优选的。你在第二个代码示例中所做的事情基本上是自己重新实现重载解析规则。