我正在尝试使用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_;
您要寻找的功能是variant::emplace
。您的功能将变为:
void SetValue(auto&& value)
{
data_.emplace<1>(std::forward<decltype(value)>(value));
}