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

如何解决在某些情况下, 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.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?