通过索引设置std :: variant的值

问题描述 投票:0回答:1

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

但是,我面对着一些有趣的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();
}

[我还想到一些真正的瘦包装器类可以在这里提供帮助,我想可以用某种方式编写它,并由编译器对其进行优化。

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

c++ c++17 variant
1个回答
0
投票

您要寻找的功能是variant::emplace。您的功能将变为:

    void SetValue(auto&& value)
    {
        data_.emplace<1>(std::forward<decltype(value)>(value));
    }
© www.soinside.com 2019 - 2024. All rights reserved.