按索引设置 std::variant 的值

set a value of std::variant by index

我正在尝试使用 std::variant 创建类似即将到来的(如果有的话)std::expected 的东西。我认为这样的事情会很容易,但可能不是最优的。

但是,我遇到了一些有趣的 std::variant 练习,它是如何通过索引赋值?我接近它的唯一方法是在下面的示例中,最后可能还不错,但乍一看仍然很奇怪。 (但我不确定它是否足够通用)

#include <variant>

template<typename ValueType, typename ErrorType>
class Expected
{

    std::variant<std::monostate, ValueType, ErrorType> data_;

public:
    const ValueType& GetValue()
    {
        return std::get<1>(data_);
    }

    void SetValue(auto&& value)
    {
        data_ = decltype(data_)(std::in_place_index_t<1>{}, std::forward<decltype(value)>(value));
    }

};

int main()
{
    Expected<bool, bool> e;
    e.SetValue(false);
    return e.GetValue();
}

我还有一个想法,一些非常薄的包装器 class 可以在这里提供帮助,我想它可以用某种方式编写,编译器会对其进行优化。

std::variant<std::monostate, ValueWrapper<ValueType>, ErrorType> data_;

您要查找的函数是variant::emplace。您的函数变为:

    void SetValue(auto&& value)
    {
        data_.template emplace<1>(std::forward<decltype(value)>(value));
    }