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 [ ], 若找到, 就用这个特化版本. 否则查找其他的.
所以说, 在参数的处理上, 这种现象也可以作为模板的一种工具来进行使用.
