具有不可移动类型的boost :: variant

时间:2016-04-02 14:50:07

标签: c++ boost boost-variant

我有一个不支持移动的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());

1 个答案:

答案 0 :(得分:3)

不幸的是,文档说变体的模板参数列表中的任何类型都必须是 BoundedType ,其定义如下:

  

BoundedType

     

对有界类型的要求如下:

     

CopyConstructible或MoveConstructible。

     

Destructor坚持无抛出异常安全保证。

     

在变体模板实例化时完成。 (有关接受不完整类型以启用递归变体类型的类型包装器,请参阅boost :: recursive_wrapper。)

     

指定为变体的模板参数的每个类型必须至少满足上述要求。此外,变体的某些特征只有在其有界类型满足以下附加概念的要求时才可用......(等)

所以看起来好像你需要存储一个引用,或者更可能是变体中的std::unique_ptr<T>(或者封装智能指针的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"));