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"));
Другие вопросы по тегам