作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
<分区>
这是来自 Static polymorphism in C++ 的后续问题
什么时候我应该更喜欢鸭子打字?
什么时候我应该更喜欢 CRTP?
有什么最佳实践吗?
归结为:
template<typename T>
void print_renderer(const renderer<T> &r){
r.get();
}
对比
template<typename T>
void print_renderer(const T &r){
static_assert(is_renderer<T>,"Not a renderer");
r.get();
}
到目前为止我观察到的:
CRTP 不如运行时多态性好用。要创建多态接口(interface),某人只需使用 virtual
和 override
.这两个关键字都不能与 CTRP 一起使用。如果我在我的实现中有拼写错误,它将触发运行时错误。 (也许这可以避免)
鸭子打字非常简单,但可能会让我的客户感到困惑。如果他们无法访问源代码并且必须使用 void print_renderer(T r)
对比void print_renderer(renderer<T> r)
我认为CRTP更清晰。
鸭子打字确实有维护成本。在我之前的问题中,我创建了一个 open_gl
和 direct_draw
我的渲染器的实现。如果我想添加另一个渲染器,例如 open_gl_es
,我还必须更改我的 is_renderer<T>
功能。但我认为这不会太糟糕。
我是一名优秀的程序员,十分优秀!