2017-12-05 16 views
0

タイトルで正確に問題に対処してくれて申し訳ありませんが、ここに事があります。
はのは、私は、アダプタだとしましょう、と私は別の機能をリダイレクトする必要があり、以下のリストされている
constリスト参照引数を変換し、別の関数に渡すうまい方法ですか?

私の所有者が私の関数を呼び出すと、最初にこのように私に引数を渡すことになります。

void receive (const list<Obj>& Larr){ 
    // do some transforming 
    // Then call "send" 
} 

そして私は他の誰かを呼び出す必要がありますが、異なるコンテナ引数を持つ:

void send (const vector<Obj*>& Varr){ 
    // .... 
} 

ので「CONST」の制約のため、明らかに、私は単に 'で行うことはできません以下のような一back反復によって要素の繰り返しの」ポインタ:

void receive (const list<Obj>& Larr){ 
    for (list<Obj>::const_iterator it = Larr.begin(); it != Larr.end(); it++) 
     // vec is my class member 
     vec.push_back(&(*it)); // compile error: no match function 
     // Because expected element is (Obj*) rather than (const Obj*)    
} 

だから私が考える唯一の方法はLarr内のすべての要素をコピーすることで、その後、私は放送しようとしていた、ベクターに自分のアドレスを一back:

ここで私の質問は、このシナリオでは、インターフェイスを変更することを許可していない、私はこれを達成することができる方法は何ですか?

+0

'constのベクトル&Varr'使用していないのはなぜ?リストをconstにしてはいけません。そうでないと、呼び出し側が予期せぬ変更をindireclyで行うことができます。 – Phil1970

答えて

0

constの制約については正しいですが、定義すると変更できません。あなたの唯一のオプションは、リストをベクトルに変換するか、またはリストタイプをサポートするsendメソッドをオーバーロードすることです。

あなたのベクター構築を簡素化する範囲ベースのコンストラクタを使用することができ、すなわち

std::vector<Obj> tmp{ Larr.begin(), Larr.end() }; 
+0

ああ!そうですか!簡素化のためのあなたの返信をありがとう、よりエレガントにする: ") –

関連する問題