この質問How to define a general member function pointerの受け入れられた回答から学んだ、コールバックのように機能するテンプレート クラスを作成することができました。
文字列に一致する適切なコールバックを呼び出せるように、文字列キーとコールバック値のマップが必要です。これは問題ありませんが、さまざまなクラスからのコールバックをサポートするマップが必要です。現在、1 つのクラスでのみ機能します。テンプレートのために任意のクラスにすることができますが、同じクラスからのコールバックのコレクションのみです。
class Apple {
public:
void Red () {
cout << "aa";
}
};
class Orange {
public:
void Blue () {
cout << "bb";
}
};
template <typename T>
class Callback {
T *obj;
void (T::*ptr) (void);
public:
Callback (T *obj, void (T::*ptr) (void)) : obj (obj), ptr (ptr) {
}
void Call () {
(obj->*ptr) ();
}
};
こんな感じで使えます
Apple apple;
Orange orange;
Callback <Apple> callA (&apple, &Apple::Red);
Callback <Orange> callB (&orange, &Orange::Blue);
callA.call ();
callB.call ();
std::map <std::string, Callback <Apple>> appleCallbacks;
これができるようになりたい
std::map <std::string, Callback <anything>> anyCallbacks;
これを、同じ基本クラスを共有し、名前とそれが属するクラスを除いて定義が互いに同一である関数を持つクラスの束で使用する予定です。
class Base { };
class ChildA : public Base {
public:
void Talk ();
}
class ChildB : public Base {
public:
void Walk ();
}
したがって、これが機能する場合、 Talk () と Walk () の両方をマップに配置できます。
これはまったく可能ですか、それとも私の視点にはそもそも欠陥がありますか?