C++11 で導入された移動セマンティクスを使用できないため、移動セマンティクスをエミュレートするために、scoped_ptr を使用し、swap を明示的に使用して所有権の変更を示すことがあります。
含まれている boost::variant タイプでこれを行う方法がわからないという問題に遭遇しました。簡単にするために、次の単純な例を取り上げます。
#include <boost/scoped_ptr.hpp>
#include <boost/variant.hpp>
#include <string>
#include <vector>
typedef boost::variant<
boost::scoped_ptr<std::string>,
boost::scoped_ptr<std::vector<std::string> > vType;
int main(int argc, char **argv) {
boost::scoped_ptr<std::vector<std::string> > vec = new std::vector;
vType var;
// How do I assign vec to var to hand off ownership and prevent
// recreation of the vector?
// ??
return 0;
}
boost::swap(boost::variant, value::type)
バリアントの内部の値の型で swap を使用してバリアント値を割り当てるオーバーロードまたは代替のようなものはありますか? それが理想的なソリューションでしょう。
私がすでに検討したこと:
コピーを防ぐために shared_ptr を使用することもできますが、私はむしろ scoped_ptr を使用して単一の所有権を強制し、shared_ptr のオーバーヘッドを取り除きます。
std::auto_ptr は私が望むセマンティクスを提供しますが、誤って割り当てを行って所有権を切り替えるのも簡単です。これまでのところ、これが私の最良の選択肢のように思えますが、記載されている理由により、意図的にそれを避けていました.
セマンティクスのように内部的に移動するコピー代入演算子を持つバリアントで使用される文字列とベクトルのラッパー クラスまたはテンプレートを作成できますが、std::auto_ptr を使用することもできます。
boost::variant を使用する代わりにユニオン (like) クラスを作成することもできますが、バリアント型を処理するブーストで利用できるツールのいくつかを利用したかったのです。
それで、私が列挙したオプションに対する他の提案、または良い議論はありますか?
アップデート
この質問は似ています: boost::variant; std::unique_ptr とコピー
その質問の結論は、コピー不可能な型はブースト バリアントでは使用できないということですが、一般的なユースケースを解決する必要があります。 +11 右辺値のセマンティクス。