【发布时间】:2021-07-19 01:05:27
【问题描述】:
std::any 中存储了一个值,我想知道它是整数值(char、short、int、long,有符号和无符号)还是浮点值(@ 987654328@、double) 或其他。
如果我只需要检查 int 值,我会这样做:
std::any a;
if (a.type() == typeid(int)) {
// do some logic for int
}
但是为 C++ 中的所有整数类型做一个巨大的if (a.type() == typeid(int) || a.type() == typeid(signed char)...) 似乎......不好。
如果我可以以某种方式访问T 类型,我可以使用type_traits 中的is_arithmetic<T>,但我没有,我只有std::any#type(),它返回std::type_info。
有没有办法在if 条件中不出现许多析取现象?
(如果重要的话,我使用的是 C++20)
【问题讨论】:
-
std::any_cast并捕获抛出的异常,如果它是错误的类型?但请注意,int可以转换为几乎任何其他数字类型,因此这可能不起作用。话虽如此,一般来说,使用typeid选择程序路径通常是糟糕设计的标志。 -
这就是 std any 的工作方式,这就是它的局限性。如果您想要更花哨的东西,请使用您的方式类型擦除(例如,构建在 std any 之上)或使用其他库,如 Boost.TypeErasure boost.org/doc/libs/1_76_0/doc/html/boost_typeerasure.html。关键是您正在寻找基于概念的类型擦除而不是基于类型。