【问题标题】:Strip boost::shared_ptr from a template parameter从模板参数中去除 boost::shared_ptr
【发布时间】:2012-06-26 00:35:50
【问题描述】:

我正在开发一个 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,因为它只需要指针类型。有没有一种干净的方法来解决这个问题?

【问题讨论】:

    标签: c++ boost shared-ptr


    【解决方案1】:

    模板元函数将为您剥离:

    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&lt; T &gt;,它将返回T*;否则它将返回它被实例化的类型。

    【讨论】:

    • 谢谢,问题解决了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-12
    相关资源
    最近更新 更多