【发布时间】:2020-07-21 16:55:46
【问题描述】:
从 C++20 开始,我们可以:
constexpr bool is_little_endian = std::endian::native == std::endian::little;
如果可用,我希望有执行此操作的代码,否则执行运行时检测。这可能吗?
也许代码看起来像:
template<bool b = std_endian_exists_v> constexpr bool is_little_endian;
template<> constexpr bool is_little_endian<true> = std::endian::native == std::endian::little;
template<> constexpr bool is_little_endian<false> = runtime_detection();
我知道通过预处理器测试__cplusplus 是可能的,但是编译器在各个阶段支持C++20,因此这不是一个可靠的指标。
【问题讨论】:
-
"当前版本的godbolt gcc 9.3
-std=c++2a没有std::endian" godbolt.org/z/aRFCps -
你可以让你的构建系统通过尝试编译一个使用
std::endian的测试程序来检测它,然后有条件地定义一个预处理器符号,但我觉得这不是你正在寻找的答案. -
@cpplearner 嗯很奇怪,我做了几乎完全相同的事情,但失败了,哦,好吧
-
我正要提出一个 cough 预处理器解决方案来检查 VC++ 与 g++ 的定义。但我怀疑你想要一个通用的解决方案。具有讽刺意味的是,这就是 reference page 提出的实现方式。
-
我认为
constexpr和runtime_detection()不能在同一行 ;-)
标签: c++ endianness constexpr c++20