0

いくつかのクラスを任意の型の値でptr_mapにパックしています。

class EventManager
{
   ptr_map<string, any> mSomeMap;
   public:
      typedef signals2::signal<void (int someSignature)> KeyEvent;
      EventManager()
      {
         mSomeMap["KeyPressed"] = new any(new KeyEvent());
      }
};

ここで、シグナルオブジェクトを任意のオブジェクトから復元したいと思います。これのための特別な関数はここにあります:

template<typename EventType>
EventType *get(const string &signalName)
{
    try {
        return any_cast<EventType*>(mSomeMap[signalName]);
    } catch(bad_any_cast &e){}
}

覚えていると思いますが、ブーストのシグナルはコピーできないので、ポインターのみを格納でき、関数もポインターを返す必要があります。

使用例:

evManager.get<EventManager::KeyEvent>("KeyPressed");

ここでセグメンテーション違反が発生します。get関数で各オブジェクトのタイプを確認しました。

typeid(EventType).name()
→ N5boost8signals26signalIFvRN2sf5Event8KeyEventEENS0_19optional_last_valueIvEEiSt4lessIiENS_8functionIS6_EENSB_IFvRKNS0_10connectionES5_EEENS0_5mutexEEE

mSignalAssociation[signalName].type().name()
→ N10__cxxabiv119__pointer_type_infoE

何が問題なのですか?キャスティングに沿ったセグメンテーション違反。オブジェクトは挿入されたタイプで構成されている必要がありますか?キャストしたくない理由。

4

1 に答える 1

3
ptr_map<string, any> mSomeMap;

...
    mSomeMap["KeyPressed"] = new any(new KeyEvent());

ここで何が起こるか分かりますか?最初に、 Pointerになる KeyEvent オブジェクトを動的に作成します。次に、このポインターは動的に作成される any-object にラップされます。これはポインターを返します。このポインターは、割り当てによって暗黙的に別の any オブジェクトにラップされます。

また、任意のオブジェクトから正しい値を抽出するには、正確な型を知る必要があります。したがって、たとえば、 -pointer を any オブジェクトにパックすると、オブジェクトがタイプを追跡するために使用するという点で、とは異なるタイプであるため、Derivedを介してアクセスすることはできません。パックされたポインターをポインターに変換する方法がわかりません。any_cast<Base*>Base*Derived*std::type_infoboost::anyboost::anyDerivedBase

any-objects へのポインターを含む -objectsで非常に多くのものをラップする特別な理由はありますanyか? のようなものを使用するのは理にかなっていませんptr_map<KeyType,BaseType>か? ポインターを任意のオブジェクトにパックした場合でも、指し示す先を自分で削除する必要があることはご存知ですよね? any-object はこれを行いません。

于 2010-06-19T14:55:32.667 に答える