【发布时间】:2018-12-23 23:43:18
【问题描述】:
如果我想使用std::any,我可以在关闭 RTTI 的情况下使用它。以下示例也可以使用-fno-rtti 和 gcc 按预期编译和运行。
int main()
{
std::any x;
x=9.9;
std::cout << std::any_cast<double>(x) << std::endl;
}
但是std::any 是如何存储类型信息的呢?如我所见,如果我使用“错误”类型调用std::any_cast,我会得到std::bad_any_cast 的预期异常。
这是如何实现的,或者这可能只是一个 gcc 功能?
我发现boost::any 也不需要 RTTI,但我也发现不是如何解决的。 Does boost::any need RTTI?.
深入研究 STL 标头本身并没有给我答案。该代码对我来说几乎无法阅读。
【问题讨论】:
-
Boost 有自己的 typeinfo 来代替 RTTI,这就是为什么
boost::any不需要它。一般来说,除了实现自己的不依赖于 RTTI 的 typeinfo 之外,我没有看到其他可能性 -
any有方法type()返回一个type_info,它真的在没有rtti 的情况下运行吗? -
@bipll:不,如果 RTTI 关闭,该功能将被关闭。所以在幕后,有些东西可以生成类似 typeid 的信息。但这似乎是实施的阴暗面;)
-
提升 type_info 来源:github.com/boostorg/core/blob/develop/include/boost/core/… enjoy :)