またはクラスMessage&
のいずれかを参照するオブジェクトを受け入れられるようにしたい。オブジェクトの基になるタイプに基づいて、またはを作成できるようにしたい。たとえば、以下を参照してください。Message1
Message2
MessageWithData<Message1>
MessageWithData<Message2>
Message&
class Message {};
class Message1 : public Message {};
class Message2 : public Message {};
template<typename Message1or2>
class MessageWithData : public Message1or2 { public: int x, y; }
class Handler()
{
public:
void process(const Message& message, int x, int y)
{
// create object messageWithData whose type is
// either a MessageWithData<Message1> or a MessageWithData<Message2>
// based on message's type.. how do I do this?
//
messageWithData.dispatch(...)
}
};
messageWithDataクラスには、基本的にMessageから継承されたメソッドが含まれており、そのタイプに基づいて、動的にダブルディスパッチしてハンドラーに戻すことができます。これまでの私の最善の解決策は、データをメッセージタイプから分離し、動的ディスパッチチェーン全体に渡すことでしたが、メッセージタイプに可変データ。
(私が多かれ少なかれフォローしている方法は、http://jogear.net/dynamic-double-dispatch-and-templatesからのものです)