【文件属性】:
文件名称:在C++中侦测内嵌型别的存在.doc
文件大小:66KB
文件格式:DOC
更新时间:2012-08-11 14:19:11
C++ 模版 动态类型
在C++中侦测内嵌型别的存在
动机(Motivation)
假设一所大学的注册系统提供了一个注册函数:
template
void Register(T person)
{
Register(person,typename T::person_tag());
};
而对于注册者有以下几种标识:
struct student_tag{};
struct teacher_tag{};
还有Register的几个供内部使用的重载版本:
template void Register(T p,student_tag){...} //注册学生
template void Register(T p,teacher_tag){...} //注册教师
并规定学生类一定要在内部typedef student_tag person_tag ;教师类typedef teacher_tag person_tag ;这样,当传给起初的那个Register的对象为学生类对象时,typename T::person_tag()其实构造了一个student_tag对象,从而激发函数重载,调用Register内部版本的template void Register(T p,student_tag);版本。其他情况亦均有对应。这是泛型编程里的常用手法,STL里屡见不鲜。
问题是,现在学校里假如不止学生教师,还有工人,警卫等其它人员。如果他们不会在类内部typedef任何东西,则Register需要一种机制以确定T内部是否typedef了某个标识符(例如person_tag)。如果没有,就默认处理。如果有,则再进行更详细的分类。