3

C ++で、メッセージを汎用構造体でラップするメッセージングシステムがあるとします。

template<typename T>
struct Message
{
  std::string Name;
  T Data;
};

この構造体の純粋に汎用バージョンを使用する必要がある関数を含むインターフェースもあります。

class Interface
{
  public:
    virtual ~Interface() { }
    virtual void Receive(Message& message) = 0;
    virtual Message Send() = 0;
};

ただし、Messageタイプに名前を付けることはなくなりました。Message<float>名前のMessage<std::string>種類など。実装するクラスはInterface異なるものをキャッチしたいのでMessage、特定のタイプを定義することはできません。

これを修正するために私が考えることができる唯一の方法は、テンプレートを取り除いて継承を使用することですが、その後、コード全体にIntMessageandのようなものが散らばっていて、BoolMessage非常に醜いように見えます。私がこれを私が望む方法でどのように行うことができるかについての考えはありますか?

4

2 に答える 2

2

簡単なアプローチは、Message型を階層に分割することです。

struct MessageBase {
  std::string Name;
};
template<typename T>
struct Message : MessageBase
{
  T Data;
};

MessageBase&その後、インターフェイスを通過するだけです。

【前は動かない。MessageBase&関数は任意のオブジェクトを受け入れることができますReceiveが、コンパイル時にタイプが不明なメッセージを引数に格納することについてのようです。ただし、動的な割り当てを気にしない場合Messageは、名前とポインタを保持する を使用してから、 (上記のテンプレート) のMessageBase異なる実装を使用できますMessageImpl]

もう 1 つの一般的な方法は、考えられるすべてのメッセージをユニオンに追加し、ユニオンを渡すことです。

于 2012-10-04T18:53:51.923 に答える
1

インターフェイスをテンプレートとして定義してみませんか?

template<typename T>
class Interface
{
  public:
    virtual ~Interface() { }
    virtual void Receive(Message<T>& message) = 0;
    virtual Message<T> Send() = 0;
};
于 2012-10-04T18:46:11.437 に答える