gpt4 book ai didi

c++ - 当 what() != T 时,如何使 boost::variant 返回 T(),或者如何检查 T==what()?

转载 作者:太空宇宙 更新时间:2023-11-04 11:25:03 24 4
gpt4 key购买 nike

我有这个代码:

std::vector<boost::variant<int,float,std::string>> data;
template<typename T> T Get(size_t i)
{
if (i < data.size())
return boost::get<T>(data[i]);
return T();
}

我如何检查 get<T>失败所以我可以return T() (无一异常(exception),因为它的性能成本非常高)?

最佳答案

一般来说你不能。

如果您知道类型索引,您可以 - 或许 - 使用 variant::which 做一些脆弱的事情.

不过,万无一失的方法是自己编写访问者。这是一个概念证明:

namespace detail {
template <typename T>
struct get_with_default_visitor : boost::static_visitor<T> {
T default_;
get_with_default_visitor(T dv) : default_(dv) {}

T const& operator()(T const& v) const { return v; }

template <typename Other> T operator()(Other const&) const {
return default_;
}
};
}

template<typename T, typename Container> T Get(Container const& data, size_t i, T defaultvalue = T())
{
if (i < data.size())
return boost::apply_visitor(detail::get_with_default_visitor<T>(defaultvalue), data[i]);
else
return defaultvalue;
}

查看 Live On Coliru

int main() {
std::vector<boost::variant<int, float, std::string> > data {
42, 3.14f, std::string("hello world") };

for (int i = 0; i < 5; ++i) std::cout << Get<int>(data, i, -99) << "\t";
std::cout << "\n";

for (int i = 0; i < 5; ++i) std::cout << Get<float>(data, i, -9999e99) << "\t";
std::cout << "\n";

for (int i = 0; i < 5; ++i) std::cout << "'" << Get<std::string>(data, i, "#error#") << "'\t";
std::cout << "\n";
}

打印

42  -99 -99 -99 -99 
-inf 3.14 -inf -inf -inf
'#error#' '#error#' 'hello world' '#error#' '#error#'

关于c++ - 当 what() != T 时,如何使 boost::variant 返回 T(),或者如何检查 T==what()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26952116/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com