如何判断模版参数是不是指针?
本帖最后由 zilaishuichina 于 2013-03-01 17:21:10 编辑 template <class T>
struct A
{
T m_Obj;
}
可以定义
A<B> a1;
也可以定义
A<C *> a2;
现在我想在模板中判断m_Obj的类型是一个对象类型,还是对象的指针
因为在模板中使用m_Obj时,
如果m_Obj是对象类型,那么应该是m_Obj.XXX
如果m_Obj是对象的指针类型,那么应该是m_Obj->XXX
[解决办法]
可以如下这样做:
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<class T>
T& getRef(T& o)
{
return o;
}
template<class T>
T& getRef(T* o)
{
return *o;
}
用这个函数模板就可以.
当需要用到m_Obj时:
getRef(m_Obj). xxx;
当然,解法还是很多的,
------解决方案--------------------
boost里有现成方法
http://www.boost.org/doc/libs/1_43_0/libs/type_traits/doc/html/boost_typetraits/reference/is_pointer.html