オブジェクトにアタッチできる可能性のあるメタデータのコンテナーを作成しようとしました。クラスにアタッチされるオブジェクトの種類ごとに最大で1つのオブジェクトが存在することを保証できますが、異なるタイプのオブジェクトをアタッチすることに制限はありません。たとえば、の2つのインスタンスをwordInfo
オブジェクトにアタッチすることはできませんが、のインスタンスwordInfo
とphraseInfo
クラスを同時にオブジェクトにアタッチすることはできます。これが私がそれを成し遂げるためにこれまでにしたことです。
class object
{
std::map <std::type_info, object*> mMetaData;
public:
inline void attachMetaData(object* pData)
{
mMetaData[typeid(*pData)] = pData;
}
template <class T> inline std::enableif<std::is_base_of<object,T>::value, T*>::type getMetaData()
{
if (mMetaData.find(typeid(T)) == mMetaData.end())
return NULL;
else
return mMetaData[typeid(T)];
}
template <class T> inline std::enableif<std::is_base_of<object,T>::value, void>::type detachMetaData()
{
mMetaData.erase(typeid(T));
}
}
上記のコードでコンパイルエラーが発生しました。less演算子が定義されていないためstd::type_info
、lessクラスを特別に定義std::type_info
し、次のようにマップクラスの3番目のテンプレートパラメーターとして渡します。
struct typeinfoless
{
bool operator()(std::type_info& left, std::type_info& right)
{
return left.hash() < right.hash();
}
}
std::map <std::type_info, object*, typeinfoless> mMetaData;
しかし、解決方法がわからない別のエラーが発生しました。std::type_info
プライベートコンストラクター、さらにはプライベートコピーコンストラクターがあるため、そこからクラスを派生させることさえできません。どうすればこの問題を解決できますか?または私のobject
クラスを作成する他の可能な方法はありますか?