按索引设置 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));
}
我正在尝试使用 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));
}