从模板参数中剥离boost :: shared_ptr

时间:2012-06-26 00:35:51

标签: c++ boost shared-ptr

我正在开发一个C ++模板库,它使用存储在boost :: shared_ptr中的基本类型和指针类型。我遇到了一个帮助类的问题,该类用于在传递到库的较低层之前将基本类型打包到容器类中。下面显示了刚刚传递指针的基本类型,以及std :: string的实现,它是其中一个基元。

template <class T> class RRPrimUtil 
{ 
public:
    static rr_DataType GetTypeID() {return rr_void_t;} 


    static boost::shared_ptr<RRObject> PrePack(T val)     {return rr_cast<RRObject>(val);} 

    static T PreUnpack(boost::shared_ptr<RRObject> val) {return rr_cast<T>(val);} 
};

template<> class RRPrimUtil<std::string>
{
public:
    static rr_DataType GetTypeID() {return rr_string_t;} 
    static boost::shared_ptr<RRObject> PrePack(std::string val) {return rr_cast<RRObject>(stringToRRArray(val));} 
    static std::string PreUnpack(boost::shared_ptr<RRObject> val) {return RRArrayToString(rr_cast<RRArray<char>>(val));} 

};

rr_cast&lt;&gt;()函数是dynamic_pointer_cast的别名。我遇到的问题是,对于一般情况,模板“T”包括“boost :: shared_ptr”前缀,因为这种类型可能会或可能不会与shared_ptr交互。前缀混淆了dynamic_pointer_cast,因为它只需要指针类型。有没有一种干净的解决方法?

1 个答案:

答案 0 :(得分:3)

模板元函数会为您删除:

template<typename T> struct primitive_type
{
    typename T type;
};

template<typename T> struct primitive_type< boost::shared_ptr< T > >
{
    typename T* type;
};

如果传递给它的类型采用boost::shared_ptr< T >形式,则会返回T*;否则它将返回它实例化的类型。