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を台無しにします。これを回避するためのクリーンな方法はありますか?