分类
- 按照作用时期
编译时期 | 运行时期 |
---|---|
模板(偏)特化 | 虚函数 |
nest 技术 | typeid |
traits 技术 | dynamic_cast |
decltype |
- 按照支持等级
语言支持 | 编程技巧 |
---|---|
模板(偏)特化 | nest 技术 |
虚函数 | traits 技术 |
typeid , dynamic_cast decltype |
- 按照最先支持标准
C++99 | C++11 |
---|---|
模板(偏)特化 , nest 技术 , 虚函数 , traits 技术 , dynamic_cast | typeid , decltype |
一一介绍
模板(偏)特化
代码示例博客
虚函数
原理解析博客
http://blog.csdn.net/wuchuanpingstone/article/details/6742465
dynamic_cast
判断父指针能否转化为子指针.
效率较低.
typeid & decaltype
使用 :
原理 :
假设我们需要写一个通用的copy
接口 , 我们想知道当前类型是否为 POD , 来判断是否可以使用memcpy
:
class true_value{};
class false_value{};
template<class T>
bool __copy( T *from , T *to , true_value )
{
memcpy(to,from,sizeof(T));
}
bool __copy( T *from , T *to , fasle_value )
{
// TODO : 深层拷贝 ...
}
template<class T>
bool copy( T *from , T *to )
{
return __copy(T from , T to , ? );
}
下面的技术用来解决上面的 ? , 也就是说如何判断当前的数据类型是否POD .
Nest
类中内嵌标识类型.
struct Test_A_POD
{
// ... some data
typedef true_value is_POD ;
};
struct Test_Not_A_POD
{
// ... some data ptrs
typedef false_value is_POD;
};
那么我就可以通过
T::is_POD() 来作为参数
Traits
优质博客:
http://www.cnblogs.com/youthlion/archive/2011/12/01/2255618.html
如果我们的copy 接口同样需要处理基本数据类型, 那Nest就无能为力了 .
template<class T>
class Traits
{
typedef false_value is_POD;
};
template<class T>
class Traits<Test_A_POD>
{
typedef true_value is_POD;
}
template<class T>
class Traits<Test_Not_A_POD>
{
typedef false_value is_POD;
}
template<class T>
class Traits<int>
{
typedef true_value is_POD;
}
替代
T::XXX
的方案是Traits<T>::XXX
.