1

typeid型の安全性が通常の予防措置をすべて差し控える「十分に難しい」基準であるかどうか疑問に思っていました。具体的には、次のコード スニペットを検討してください。

class storage
{
private:
    std::map<std::type_index, void*> objects;

public:
    template<typename T>
    void put(T* ptr)
    {
        objects[typeid(*ptr)] = ptr;
    }
};

storage stor;

ClassA* a = new ClassA();
ClassB* b = new ClassB();

stor.put(a);
stor.put(b);

からの情報を使用してマップからオブジェクトを取得しても安全typeidですか?

template<typename T>
T* storage::get()
{
    return static_cast<T*>(objects[typeid(T)]);
}

ありがとう、N.

4

1 に答える 1

1

a2と同じ値を持つという意味で機能しaます。

必ずしも「安全」とは限りません。たとえば、aの何らかの派生クラスのインスタンスを指している場合、Aa2と同じ値を持つことは保証されませんa。したがって、安全性は、「通常の予防措置を忘れる」という意味に依存します。void*ポインターを変換した場合は、元の型に戻す必要があるという「注意事項」を忘れることはできません。

于 2013-05-27T17:14:59.247 に答える