如何在C++中使用CRTP来避免虚拟成员函数的开销?
有两种方法.
第一个是通过静态为类型结构指定接口:
templatestruct base { void foo() { static_cast (this)->foo(); }; }; struct my_type : base { void foo(); // required to compile. }; struct your_type : base { void foo(); // required to compile. };
第二个是避免使用引用到基础或指针到基础的习惯用法并在编译时进行连接.使用上面的定义,您可以使用如下所示的模板函数:
template// T is deduced at compile-time void bar(base & obj) { obj.foo(); // will do static dispatch } struct not_derived_from_base { }; // notice, not derived from base // ... my_type my_instance; your_type your_instance; not_derived_from_base invalid_instance; bar(my_instance); // will call my_instance.foo() bar(your_instance); // will call your_instance.foo() bar(invalid_instance); // compile error, cannot deduce correct overload
因此,在函数中结合结构/接口定义和编译时类型推导允许您进行静态调度而不是动态调度.这是静态多态的本质.
我一直在寻找CRTP的正确讨论.托德Veldhuizen的科学的C++技术是一个很好的资源(1.3)等诸多先进技术,如表情模板.
另外,我发现你可以在Google书籍上阅读Coplien的大部分原创C++ Gems文章.也许情况仍然如此.