2

オブジェクトにアタッチできる可能性のあるメタデータのコンテナーを作成しようとしました。クラスにアタッチされるオブジェクトの種類ごとに最大で1つのオブジェクトが存在することを保証できますが、異なるタイプのオブジェクトをアタッチすることに制限はありません。たとえば、の2つのインスタンスをwordInfoオブジェクトにアタッチすることはできませんが、のインスタンスwordInfophraseInfoクラスを同時にオブジェクトにアタッチすることはできます。これが私がそれを成し遂げるためにこれまでにしたことです。

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クラスを作成する他の可能な方法はありますか?

4

2 に答える 2

7

古代の質問に答えてしまったことをお詫びしますが、これは私がそれを理解しようとしたときのグーグルでの最初の結果でした。ラッパークラスを作成する代わりにstd::type_index、マップへのキーとしてラッパークラスを使用する必要があります。

于 2012-10-06T13:03:39.470 に答える
2

次のように、std::type_infoのラッパークラスを作成します。

class TypeWrapper
{
    private const std::type_info &mInfo;
    public TypeWrapper(const std::type_info &info) : mInfo(info)
    {
    }
    // Functions required by a key into a std::map.
};

マップへのキーとして使用TypeWrapperします。

于 2011-06-20T21:49:59.970 に答える