0

boost::shared_ptrに格納されているプリミティブ型とポインタ型の両方を使用するC++テンプレートライブラリを開発しています。ライブラリの下位層に渡される前に、必要に応じてプリミティブ型をコンテナクラスにパックするために使用されるヘルパークラスに問題があります。以下に、ポインタを渡すだけの基本タイプと、プリミティブの1つである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を台無しにします。これを回避するためのクリーンな方法はありますか?

4

1 に答える 1

4

テンプレートメタ関数はそれを取り除きます:

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*それ以外の場合は、インスタンス化された型を返します。

于 2012-06-26T00:40:04.503 に答える