2016-04-02 18 views
3

私は運動をサポートしていないタイプTを持っている:ブースト::不動の型を持つバリアント

struct T { 
    T(); 
    T(T const&) = delete; 
    T& operator=(T const&) = delete; 
    T(T&&) = delete; 
    T& operator=(T&&) = delete; 
}; 

どのように私はタイプboost::variant<T>のオブジェクトを作成するのですか? boost::variant<T>のコンストラクタは明らかに引数を移動しようとするため、次は、失敗します。あなたのための不幸

boost::variant<T> x(T()); 

答えて

3

を、ドキュメントには、バリアントのテンプレート引数リストのいずれかのタイプがあるBoundedType、でなければならないことを言いますこのように定義された次のよう

BoundedType

有界タイプに対する要求である:

CopyConstructibleまたはMoveConstructible。

デストラクタは、ノースローの例外安全の保証を維持します。

バリアントテンプレートのインスタンシエーションの時点で完了します。 (再帰バリアント型を有効にするために不完全型を受け入れる型ラッパーについては、boost :: recursive_wrapperを参照してください)

バリアントへのテンプレート引数として指定されたすべての型は、少なくとも上記の要件を満たす必要があります。さらに、バリアントの特定の機能は、その限定されたタイプが以下の追加コンセプトの要件を満たす場合にのみ利用できます。

したがって、参照を格納するかのように見えますが、 (またはスマートポインタをカプセル化するTのいくつかのラッパー)の中のstd::unique_ptr<T>である可能性があります。

このような何か:

struct shared_t { 

    // insert appropriate constructors here, such as: 

    shared_t(std::string arg1) : _ptr(std::make_shared<T>(std::move(arg1))) 
    {} 

    operator T&() { return *_ptr; } 
    operator const T&() const { return *_ptr; } 

    std::shared_ptr<T> _ptr; 
}; 

using my_variant = boost::variant<shared_t, int, double, std::exception_ptr, ...>; 

my_variant v(shared_t("foo")); 
関連する問題