2012-02-17 4 views
1

私はネットワークパケットを処理するための小さなアプリケーションを作成しようとしています。テストを容易にするために、このアプリがローカルストリーミングモード(std::cinを使用)とネットワークストリーミングモード(asioを使用)の2つのモードで動作できることを願っています。さまざまな種類のストリームを処理する汎用関数を作成するにはどうすればよいですか?

event_stream >> MsgHeader; 

:目標は、それが透明パケットの実際の解析を行うクライアントクラス(ES)の残りの部分に、例えば、彼らはストリームへの参照をつかむことができ作るevent_stream、その後、として解析するんですクラスMsgHeaderには、オーバーロード演算子>>があると仮定します。

ローカルストリームモードの場合:私はちょうど&cinを返します。

boost::asio::io_service io_s; 
tcp::acceptor acc(io_s. tcp::endpoint(tcp::v4(), 1950)); 
tcp::iostream stream; 
acc.accept(*stream.rdbuf()); // act as server, another client will write to it. 
return &stream; 

しかし、私は、彼らが対処しているどのようなストリームのクライアントの残りの部分は「気づかない」ようにする方法を少し失われています:ネットワークモードの場合、私はこのような何かを行うことができることを望みますか?

std::istream &in = get_event_stream(); 

答えて

1

2つの可能性:ストリーム型の

  1. テンプレート化のすべてを私はちょうどそれのように宣言することができます。過度の攻撃かもしれませんが、(スペシャライゼーションによって)標準インタフェースにすべて準拠していないストリームに柔軟性を与えることができます。異なるインターフェースは異なる専門化を必要とするが、高水準インターフェース(テンプレートの呼び出し)は少なくとも均一である。

  2. 使用するすべてのストリームが同じ基本クラスから継承されていることを確認してください(そうでない場合は、インターフェイスの違いをラップするためにアダプタクラスを用意してください)。参照がここで動作するかどうかわからない場合は、代わりにポインタ変数が必要になるかもしれません。

    std :: istream * in = & get_event_stream();

その後、あなたの関数は(ここではstd::istream)基底クラスへのポインタを取らせ、そして唯一の基底クラスが持つ機能を使用します。場合は、ポインタを必要としないので、

void some_function(std::istream *in); 
+1

参考文献は、多型をサポートそれらを明示的に使用する必要はありません。 – Jason

関連する問題