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

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

2013-03-06 
如何判断模版参数是不是指针?本帖最后由 zilaishuichina 于 2013-03-01 17:21:10 编辑template class Ts

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

热点排行