boost::不可移动类型的变体
boost::variant with immovable types
我有一个不支持移动的类型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"));
相关文章:
- 仅包含可移动 std::map 的类的移动构造函数不起作用
- 为什么协程的返回类型必须是可移动构造的?
- 我应该使我的局部变量常量还是可移动的
- 是否可以为boost::random::uniform_int_distribution<>设置确定性种子?
- 对于参加可复制和可移动类的访问者来说,应该有多少过载?
- 如何获取类型是否真正可移动可构造
- 可移动但不可复制的对象:按值传递还是按引用传递?
- 对于可移动类型,按值传递比重载函数更好吗?
- 使用参数将仅可移动对象捕获到 lambda
- 具有抑制移动构造/赋值的类型如何仍被视为可移动类型?
- 防止作用域枚举可复制/可移动
- 禁止可移动的QGraphics物品与其他物品发生冲突
- 是否有内置函数可用于boost :: numeric ::间隔
- 如何std ::移动boost :: multi_array
- 在向量中使用派生的可移动但不可压缩的会导致编译错误
- 在可移动类型的构造函数 lambda 中捕获此内容的安全使用
- 使用可移动节点创建有向图(使用 QT / Boost)
- 无法将可移动对象与Boost.Asio一起使用
- Boost序列化不可复制但可移动的对象
- 包含boost::可选对象的std::矢量对象是否可以移动?可移动助推::可选