boost::不可移动类型的变体

boost::variant with immovable types

本文关键字:可移动 boost 类型      更新时间:2023-10-16

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

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

BoundedType

有界类型的要求如下:

CopyConstructable或MoveConstructable

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"));