如何解决在某些情况下, 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 举报,一经查实,本站将立刻删除。