C++模版使用技巧--Int2Type
2013-11-03 22:41
232 查看
一 Int2Type
平常我们所看到的int是一个类型,例如1,2,3...等属于int。 但是这里说的是通过模版使每一个int类型变量都当成是不同的类型。
二 C++模版的迟绑定
这个名字是我起的,因为不知道正式的称呼是什么,意思是说在使用C++的模版的时候,只有在你的代码里面调用了某个模版方法,在编译的时候才会产生对应的方法,也即编译后的代码中不包含我们没有使用的模版方法。看下面的实例是可以编译运行的:
三 问题
大家也许会说上面的方法代码没有问题,我说,有问题,仔细看一开始的代码和我的说明,我说的是只要我们的代码里面用到模版方法就会被编译为目标代码,而不是说在代码运行的时候使用到的代码才会被编译为目标代码,好的,搞清楚了这个就可以知道上面的实例为什么通不过编译了。
四 Int2Type
下面正式进入主题Int2Type的作用和使用,上面的实例,我们传入的T类型中只有clone或public构造函数中的一个,我们想根据bool值来选择使用clone或new,但是上面的代码有问题,编译都不过偶,下面使用Int2Type来实现:
看了上面的代码,我不禁要再次的赞叹《C++设计新思维》的作者,高!
平常我们所看到的int是一个类型,例如1,2,3...等属于int。 但是这里说的是通过模版使每一个int类型变量都当成是不同的类型。
二 C++模版的迟绑定
这个名字是我起的,因为不知道正式的称呼是什么,意思是说在使用C++的模版的时候,只有在你的代码里面调用了某个模版方法,在编译的时候才会产生对应的方法,也即编译后的代码中不包含我们没有使用的模版方法。看下面的实例是可以编译运行的:
</pre><pre class="cpp" name="code">class X { public: void f() {} }; class Y { public: void g() {} }; template <typename T> class Z { T t; public: void a() { t.f(); } void b() { t.g(); } }; int main() { Z<X> zx; zx.a(); // Doesn't create Z<X>::b() Z<Y> zy; zy.b(); // Doesn't create Z<Y>::a() }
三 问题
template <typename T, bool isPolymorphic> class NiftyContainer { void DoSomething() { T* pSomeObj = ; if (isPolymorphic) { T* pNewObj = pSomeObj->Clone(); } else { T* pNewObj = new T(*pSomeObj); } } }; class Test { public: Test(){}; }; void main() { NiftyContainer<Test,true> test; //test.DoSomething(); // 这里通不过编译 }
大家也许会说上面的方法代码没有问题,我说,有问题,仔细看一开始的代码和我的说明,我说的是只要我们的代码里面用到模版方法就会被编译为目标代码,而不是说在代码运行的时候使用到的代码才会被编译为目标代码,好的,搞清楚了这个就可以知道上面的实例为什么通不过编译了。
四 Int2Type
下面正式进入主题Int2Type的作用和使用,上面的实例,我们传入的T类型中只有clone或public构造函数中的一个,我们想根据bool值来选择使用clone或new,但是上面的代码有问题,编译都不过偶,下面使用Int2Type来实现:
template <int v> struct Int2Type { enum { value = v }; }; template <typename T, bool isPolymorphic> class NiftyContainer { private: void DoSomething(T* pObj, Int2Type<true>) { T* pNewObj = pObj->Clone(); } void DoSomething(T* pObj, Int2Type<false>) { T* pNewObj = new T(*pObj); } public: void DoSomething(T* pObj) { DoSomething(pObj, Int2Type<isPolymorphic>()); } }; class Test { public: Test(){}; }; void main() { NiftyContainer<Test,false> test; //如果用ture不会通过编译 Test* t = new Test(); test.DoSomething(t); }
看了上面的代码,我不禁要再次的赞叹《C++设计新思维》的作者,高!
相关文章推荐
- C++模版使用技巧--Int2Type
- static关键字在C++中的使用技巧
- C++使用技巧:copy and swap idiom
- C++中模板类使用友元模板函数 和友员非模版函数!使用不当出现编译错误:无法解析的外部符号…
- Eclipse开发C/C++之使用技巧小结,写给新手
- C++ 使用模版范式写一个单例模式的类--简单实现单例模式
- C++几个技巧:智能指针在消息传递中的使用,元组,及lambda删除器
- c++ stl multimap基本操作使用技巧详细介绍
- C++ STL 中 map 容器的说明和使用技巧
- C++ 在模版类里面使用STL 报错?
- C++中map容器的说明和使用技巧
- C/C++中的宏的使用技巧(宏嵌套/宏展开/可变参数宏)
- Carbide.c++使用技巧及有用的插件
- thinkphp模版使用技巧 -Thinkphp兄弟连19
- C++使用技巧:copy and swap idiom
- C++--CListCtrl使用技巧
- C++通用Functor仿函数 LOKI库中的模版使用以及设计新思维
- c++难点(较高级使用技巧)总结
- C++中map容器的说明和使用技巧
- Halcon/C++使用技巧