从模板参数中去除提升::shared_ptr

Strip boost::shared_ptr from a template parameter

本文关键字:shared ptr 参数      更新时间:2023-10-16

我正在开发一个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<>() 函数是dynamic_pointer_cast的别名。 我遇到的问题是,对于一般情况,模板"T"包含"boost::shared_ptr"前缀,因为此类型可能会也可能不会与shared_ptr交互。 前缀会弄乱dynamic_pointer_cast,因为它只需要指针类型。 有没有一种干净的方法来解决这个问题?

模板元函数将为您剥离它:

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*;否则它将返回它实例化时使用的类型。