在某些情况下, boost::typeindex::ctti_type_index 是编译时类型 id 的标准兼容方式吗?

问题描述

我目前正在评估更改项目的多个类/结构的可能性,以便在编译时在 constexpr 上下文中使用它们。当前的游戏停止器是使用不能在 constexpr 上下文中使用的 typeid()std::type_index(两者似乎纯粹基于 rtti?)的情况。

所以我遇到了 boost 的 boost::typeindex::ctti_type_index

他们说:

boost::typeindex::ctti_type_index 类可以作为插件使用 替换 std::type_index。

到目前为止一切顺利。到目前为止,我能找到的唯一一个例外情况是

使用 RTTI 关闭匿名命名空间中具有相同名称的不同类 可能会崩溃。请参阅“RTTI 仿真限制”。

目前至少与 gcc、clang 和 Intel 编译器相关,并不令人惊讶。到目前为止,我可以忍受这种限制。所以我在这里的第一个问题是:除了匿名命名空间的问题,boost 在实现 constexpr typeid 生成时是否完全参考了标准兼容机制?由于依赖于编译器的开关太多,因此很难从头开始分析。有没有人已经在几种情况下获得了这方面的经验,并且可能会提到一些我在这里没有先验地看到的其他缺点?

我的第二个问题与第一个问题直接相关,是关于细节的:该实现如何在“核心级别”工作,尤其是对于比较上下文?

为了比较,他们使用

BOOST_CXX14_CONSTEXPR inline bool ctti_type_index::equal(const ctti_type_index& rhs) const BOOST_NOEXCEPT {
    const char* const left = raw_name();
    const char* const right = rhs.raw_name();
    return /*left == right ||*/ !boost::typeindex::detail::constexpr_strcmp(left,right);
}

他们为什么要注释原始的“字符串”内部比较?原始名称成员(内联引用自 raw_name())本身被简单地定义为

const char* data_;

所以我的猜测是,至少在完全 constexpr 上下文中,如果用 constexpr char* 初始化,简单比较应该符合标准(确保内联对象的唯一指针地址,即分别为 constexpr?)?标准是否已经完全保证了这一点(这里我关注的是 C++17,C++20 的相关更改?)并且仅由于常见的编译器限制而未在此处使用? (顺便说一句:我通常在代码中挣扎于非平凡的非不言自明的注释部分......)通过他们的 constexpr_strcmp,他们应用了一个琐碎但昂贵的字符比较方式,这本来是我的自定义方式也。在这里很简单,简单的指针比较将是进一步的首选。

由于重读我自己的问题而更新:所以至少对于比较案例,我目前了解启用代码的机制,但对out-commented方法感兴趣。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...