2017-10-07 9 views
0

ユニットテストのためにモック(Googleモック)を作成できるように、ほとんどのクラスのインターフェイスを作成した新しいシステムを設計しています。結果として、すべての機能は仮想ですが、問題は私が頻繁にテンプレート仮想関数の問題にこれで実行されているということです。私はマルチディスパッチを行う方法のいくつかの例を見てきましたが、それらはすべてテンプレートのバリエーションを使用しているようですが、それは単純ではないようです。それで、私のコードベース全体がテンプレートで終わって、読み込み/使用やデバッグが難しくなってしまうのでしょうか?インターフェイスベースプログラミングのためにC++仮想テンプレート関数の問題に遭遇しました

または、私は良いインターフェイスを設計していません。ここでは、私がメッセージキューのためのインタフェースを書いている簡単な例を示します。

Class IMessageQueue { 

    Public: 

    Virtual int send(const T & value); // I can't do this but this is exactly what I want to do, as send should be able to send any type 

}; 

Class MessageQueue : public IMessageQueue { 
     Public: 

     Virtual int send(const T & value) { ... } 
}; 

Class MockMQ : public IMessageQueue { 
     Public: 
     Virtual int send(const T & value) { 
       // mock implementation 
      } 
}; 

この問題を回避するにはどうすればよいですか?これはほんの一例ですが、インタフェースベースのプログラミングのために、これらのタイプの問題に遭遇します。

+0

のようにすべてのメッセージに共通する特定のインターフェイスを宣言することです、場合それらを仮想化せずに、dynamic_castで型を決定し、その型のテンプレート化されたメンバ関数を呼び出すヘルパ関数を持つことで、私はそれがあなたの特定のケースでどのくらい醜くmaintanableになるかわからない、また私はそれを試みたことがない。 – Sopel

答えて

0

IMessageQueueが特定の不明な型または任意の型をディスパッチする必要があるかどうかによって異なります。それは同じことではありません。あなたはIMessageQueue<MyMessage>IMessageQueue<OtherMessage>を持つことができるように

特定の未知のタイプは

template<typename T> 
class IMessageQueue { 
public: 
    virtual int send(const T& value); 
} 

によって管理することができます。

代わりに、あなたがメッセージキューの同じタイプのいずれかのタイプを送信できるようにする必要があり、あなたのオプションは、あなたはおそらく周り得ることができる

class Message 
{ 
protected: 
    Message() : { .. } 
}; 

class MyMessage : public Message 
{ 
.. 
}; 

class MessageQueue 
{ 
public: 
    void send(const Message& message); 
}; 
+0

ジャックに感謝します。 IMesageQueueがテンプレートクラスの場合、sendはもう仮想にできません。私は2番目のソリューションが気に入っていますが、新しいタイプのデータを送信する必要があるたびに新しいメッセージタイプのサブクラスを作成する必要があることを意味しますか?私はライブラリを作成して公開したいので、ライブラリを頻繁に変更する柔軟性はありません。私たちはおそらくテンプレートとしてメッセージを作ることができますが、私はIMessage send()メソッドがMesage を取ります。これはやはり私たちが仮想として送信することはできません。 – maverick112

関連する問題