1

の 2 つの一致するベクトルがありunique_ptrました。2 つを含む構造体の 1 つのベクトルを作成することで、それらを統合することにしましたunique_ptr(構造体には最終的に他の項目も含まれるため、このリファクタリングが行われます)。

このベクターに新しいアイテムを追加するための最良の方法は何ですか?

私の現在のコードは

std::vector<DestinationObjects> destinations;
for (unsigned short &id: ids) {
    DestinationObjects d;

    d.transmitter = unique_ptr<Transmitter> (new Transmitter(id));
    d.controller = unique_ptr<Controller> (new Controller(id));

    destinations.push_back(d);
}

もちろん、これは をコピーdし、 で問題を引き起こしますunique_ptr。これを修正するための最良の方法は何ですか?

私が考えることができるオプションは、うまくいくかどうかわからないものもあります:

  1. に切り替えるだけshared_ptrです。(単純な検索置換ですが、警官のように感じます)。
  2. unique_ptr を移動する構造体の移動コンストラクターを記述します。(構造体を展開すると、うまくいかない可能性があります)。
  3. unique_ptr のヌル ポインターを使用して空の構造体インスタンスをプッシュ バックし、これらをベクター内で一度編集します。(厄介な構文。また、これが機能するかどうかもわかりません)。

別のアプローチは何ですか?または、リストしたもののいずれかを優先する必要があるのはなぜですか?

4

1 に答える 1

1

シンプルにvec.emplace_back( std::move(d) ).

(コメントで述べたように)コンパイラが暗黙の移動コンストラクタを実装していない場合は、独自のmoveコンストラクタを作成してください。今後の私のアドバイスは、C++11 の機能に問題があり、質問するときはいつでも、「C++11 サポート」である可能性がかなり高いため、このコンパイラを使用していることを伝えることです。重要な問題です。

コンパイラがムーブ コンストラクタをまったくサポートしていない場合は、使用を中止してください。コンストラクタがないと役に立ちませunique_ptrmove。;)

于 2013-11-01T14:09:57.000 に答える