首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

【C++泛型编程】编译期可变换性和继承性检测

2012-09-11 
【C++泛型编程】编译期可转换性和继承性检测问题:在设计模板函数和模板类时,面对两个型别T和U,我们怎么判断U

【C++泛型编程】编译期可转换性和继承性检测
        问题:在设计模板函数和模板类时,面对两个型别T和U,我们怎么判断U是否继承自T呢?如果能在编译器判断这样的关系,可以优化泛型编程的函数。在编译器发现这样的关系,就意味着可以不使用dynamic_cast,它会损耗执行效率。
         继承性检测可以转化成一个更一般的问题:检测任意型别T是否可以自动转化成型别U?
 解决方法:可以使用运用sizeof和函数重载的方法来检测这种可转换性。编写两个重载函数:一个接受U(U代表转换目标)的函数,另一个接受“任何型别”的函数。用型别为T的暂时对象来调用这些重载函数,而“T是否可以转化为U”是我们想知道的。如果接受U的那个函数被调用,就可以判断T可以转换为U;否则T无法转换为U。为了知道哪个函数被调用,这两个重载函数以不同大小的型别返回,用sizeof来区分其大小。
 具体方法如下:
 第一步:定义两个不同大小的型别:

#define SUPERSUBCLASS_STRICT(T,U) \(SUPERSUBCLASS(T,U)&& \!Conversion<const T,const U>::sameType)

热点排行