64,676
社区成员
发帖
与我相关
我的任务
分享
template<class Ty>
struct is_pointer;
template< typename T >
struct Is_Pointer
{
enum { RESULT = false };
};
template< typename T >
struct Is_Pointer< T* >
{
enum { RESULT = true };
};
struct TrueType {};
struct FalseType {};
template< typename T >
struct Is_Pointer
{
typedef FalseType RESULT;
};
template< typename T >
struct Is_Pointer< T* >
{
typedef TrueType RESULT;
};
于是,可以这样使用:
template <class T>
struct A
{
T m_Obj;
void fun( )
{
........
if( Is_Pointer< T >::RESULT ) ....m_Obj->xxx;
else .......m_Obj.xxx;
........
}
};
条件选择虽然可以工作,但使用了运行期代码,这得依赖于CPU的分支预测命中率了,注意到Is_Pointer< T >::RESULT是个元函数,那么可以把条件选择也移动到编译期,进行类型选择,可以改为如下这样:
template <class T>
struct A
{
T m_Obj;
void fun( )
{
.........
.......GetSubObject( Is_Pointer< T >::RESULT );
.......
}
private :
int GetSubObject( TrueType ){ return m_Obj->xxx; }
int GetSubObject( FalseType ){ return m_Obj.xxx; }
};
这样编译后实体代码就直接剩下m_Obj->xxx或者m_Obj.xxx了。
如果觉得Is_Pointer< T >::RESULT还是不够优雅,在Is_Pointer内自定义到TrueType或者FalseType的inline转换函数,可以直接使用Is_Pointer< T >,就更简洁了。
template <typename T>
struct A<T*> : A<T>
{
};