boost:: вариант с недвижимыми типами
У меня есть тип 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 ответ
К несчастью для вас, в документации сказано, что любой тип в списке аргументов шаблона должен быть BoundedType, который определяется следующим образом:
BoundedType
Требования к ограниченному типу следующие:
CopyConstructible или MoveConstructible.
Деструктор поддерживает гарантию безопасности исключений.
Завершить в точке создания варианта шаблона. (См. 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"));