在中侦测内嵌类型的存在http://blog.youkuaiyun.com/pongba)
动机假设一所大学的注册系统提供了一个注册函数:
class T>
typename T::person_tag());
而对于注册者有以下几种标识:
还有
class T> void Register(T p, student_tag){...} //
yes_type
)[1]; // sizeof(yes_type)==1no_type)[2]; // sizeof(no_type)==2
以上的两个
class T>
class U>
// 声明sizeof(check(t))==sizeof(yes_type);
注意,在我的
int key_type;
// 0
// 1
// 请注意这是个模板类按理说,这种情况下C>::value应该为 class U>
(typename U::key_type*)0);
我仅仅加了一个转换,编译器就开始抱怨说使用模板类(它指的是第二种实现是利用模板偏特化及默认模板参数的规则: class T,class>
class T,class =T>
const bool value=false;
class T>
typename check_helper typename T::key_type>::type
true;
这看起来很小巧,仅仅使用了模板偏特化。但是请耐心听我解释。如果 typename check_helper typename X::key_type>::type 而typename check_helper typename X::key_type>::type 根据 所以,如果你这样测试:而根据上面的推导,如果 于是编译器选择匹配偏特化版本,其中的而如果typename check_helper typename X::key_type>::type 也就随之不存在,则测试现在对我们的两个实现版本测试一下吧,假设有一下几个类:
typedef int key_type;};
void key_type(void){}};static const bool key_type=false;};
class>
class T>
does_sometypedef_exists
impl_type;在我的如果使用第一种实现,这将输出:如果使用第二种实现,这将输出:很显然,两种实现对于改进第一种实现还可以做一点改进,像这样:
class T>
class U>
sizeof(check (0))==sizeof(yes_type);
这样,去掉封装现在我们的
class T> /
class U> /
typename U::id*); /
class U> /
const bool value=sizeof(check (0))== sizeof(yes_type); /
经过这重封装,当你要侦测某个名称的内嵌类型如这将会扩展成一个名为::
value;这将侦测类对内嵌的侦测方法
//
缺省声明,因为不会被匹配所以不用定义