搜索

最新留言

友情链接

浏览计数器

7943

C++ 模板的又一特征

皮贝贝 posted @ 2009年12月24日 12:12 in 模板元编程 with tags template c++ , 49 阅读

众所周知, C++ 的模板元编程中,  元数据即 常量 和 类型, 很多时候我们可以通过函数重载机制来解决一些问题, 而且编译器在对模板的成员函数的编译上会采取偷懒战术. 但是, 编译器还有另一个偷懒战术, 那就是在函数的参数上:

这个问题源于我在 csdn 上的一个讨论: 如何得知一个类型是否可以进行 [ ] 下标运算. 然后有人出了答案, 答案中有这样一句:

 

template<typename T, typename U>
struct Dummy;

template<typename T, typename U>
Has_Op op_checker( const Dummy<T,&T::operator[]>* const );

 

 

 

问题就出在这里了,  求 [ ] 运算符的类型,用 &T::operator[ ] 是无法编译通过的. 所以, 我采取了迂回战术, 绕过了这个类型问题, 采用另一种元数据: 常量来解决的:

 

template<typename T, size_t N>
struct Dummy;

template<typename T, typename U>
Has_Op op_checker( const Dummy<T,sizeof(&T::operator[])>* const );

 

 

 

这样就能编译通过(gcc)了, 而且似乎是正确的.

此时, 编译器在编译时, 会试图对 op_checker 的"特化"版本( 函数重载的特化 ) 进行匹配, 要匹配就要查找 operator [ ], 若找到, 就用这个特化版本. 否则查找其他的.

所以说, 在参数的处理上, 这种现象也可以作为模板的一种工具来进行使用.

 


* 登录
*

simple_captcha.jpg
(输入验证码)