当 what() != T 时,我如何使 boost::variant 返回 T(),或者我如何检查 T==what()
How can I make boost::variant return T() when what() != T, or how do I check if T==what()?
我有这个代码:
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()
(无一例外,因为它的性能成本非常高)?
一般来说你不能
。
如果您知道类型索引,则可以 - 也许 - 对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;
}
在科里鲁观看直播
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#'
相关文章:
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 地图计数确实很重要,或者只是检查是否存在
- 什么是 std::exception::what() 以及为什么要使用它?
- 错误 C2679:二进制"<<":未找到采用类型 'std::string_view' 的右侧操作数的运算符(或者没有可接受的转换)
- 为什么文件不是由 F 流创建的,或者即使它是输出只是垃圾值?
- C2678 二进制 '==':未找到采用 'Card' 类型左操作数的运算符(或者没有可接受的转换)
- what(): basic_string::_M_construct null not valid
- 使用宏编译时使用用户定义的数学函数,或者仅使用 c++ 中标准数学库中的函数
- what(): basic_string::_M_construct 空无效错误
- What is unordered_set in C++
- 在抛出 'std::runtime_error' 的实例后终止调用 what(): Filebuf 和 ostream 的 I/O 错误
- 如何仅使用一次固定<<设置精度(2)?或者至少恢复到默认行为?
- 我们应该如何使用枚举类进行索引(或者我们应该更好地避免这种情况)?
- GoogleTest 在使用 libgtest_main.a 时给出多个主定义,或者在不使用 libgtest_main
- 使用unique_ptr并返回引用,或者我应该使用shared_ptr并在需要时制作副本
- 我是否访问了已释放的内存,或者在这种情况下DrMemory报告不正确?
- C++类:virtual和override,或者两者都没有
- 二进制 '==':未找到采用 'Enemy' 类型左侧操作数的运算符(或者没有可接受的转换)
- 自定义runtime_error,如果我在 #what 中使用#c_str(),则错误输出始终为空
- 当 what() != T 时,我如何使 boost::variant 返回 T(),或者我如何检查 T==what()