喜欢美食, 旅行..
分类: C/C++
2013-02-06 11:23:42
关于这个话题,在网上看一个哥们的博客写得挺清楚的,这里原文转载
=============================================
我们先来看一个简单的例子:
templateclass CuriousBase { … }; class Curious : public CuriousBase { … };//摘自< > //16.3 The Curiously Recurring Template Pattern (CRTP)
如果是第一次看到,你可能会觉得奇怪(我也想了半天),这里不会形成递归吗?这里有两个地方可能会产生递归,首先是声明,其次是实现的时候.比如说下面的代码:
template如果你的程序中加入了这样的代码,恭喜你了,你中了我们的大奖--崩溃;class CuriousBase { public: CuriousBase() { new Derived; } }; class Curious : public CuriousBase { public: Curious() { } };
class IAblePrint { public: void print() { cout<可惜这样做的结果不是我们需要的,那么我们设这个函数成为虚函数,然后每个类实现自己的?老天,那里有10000多个类等着我们呢.虽然全局函数是个不错的解决方案,但是那个可恶的老板!
直觉告诉我们,这些成员函数一定是要实现的,可是有没有办法让编译器来替我们完成这些无聊的工作呢?
下面就该CRTP登场了
templateclass AblePrintSize { public: void print() { cout< { int t; }; class Test2:public AblePrintSize { int t[2]; }; int main() { Test1 hu1; Test2 hu2; hu1.print(); hu2.print(); } 这里我们只是自己多写了一个template class就达到了我们的目标.上面的例子可能举的不是很好,下面有个比较好的例子,大家可以参考参考
#includetemplate class ObjectCounter { private: static size_t count; // number of existing objects protected: // default constructor ObjectCounter() { ++ObjectCounter ::count; } // copy constructor ObjectCounter (ObjectCounter const&) { ++ObjectCounter ::count; } // destructor ~ObjectCounter() { --ObjectCounter ::count; } public: // return number of existing objects: static size_t live() { return ObjectCounter ::count; } }; // initialize counter with zero template size_t ObjectCounter ::count = 0; /*If we want to count the number of live (that is, not yet destroyed) objects for a certain class type, it suffices to derive the class from the ObjectCounter template. For example, we can define and use a counted string class along the following lines:*/ // inherit/testcounter.cpp #include "objectcounter.hpp" #include template class MyString : public ObjectCounter > { … }; int main() { MyString s1, s2; MyString ws; std::cout << "number of MyString : " << MyString ::live() << std::endl; std::cout << "number of MyString : " << ws.live() << std::endl; }