问题描述
我目前正在评估更改项目的多个类/结构的可能性,以便在编译时在 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 (将#修改为@)