读书人

怎么判断模版参数是不是指针

发布时间: 2013-03-06 16:20:31 作者: rapoo

如何判断模版参数是不是指针?
本帖最后由 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

[解决办法]

引用:
本帖最后由 zilaishuichina 于 2013-03-01 17:21:10 编辑
template <class T>
struct A
{
T m_Obj;
}

可以定义
A<B> a1;
也可以定义
A<C *> a2;

现在我想在模板中判断m_Obj的类型是一个对象类型,还是对象的指针
因……

可以如下这样做:


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

读书人网 >C++

热点推荐