自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,因此这在任何一个方向上都不是可靠的指标。
我知道可以通过预处理器测试
__cplusplus
,但是编译器在各个阶段都支持C ++ 20,因此这在两个方向上都不是可靠的指标。
的确!实际上,这就是为什么我们现在有了一种全新的方法来检测对处于各个发行阶段的编译器的功能支持:功能测试宏!如果您查看SD-FeatureTest,则存在与标准中采用的每种语言和库功能相对应的宏的大表,在采用该功能时,将使用指定的值定义每个宏。
在您的特定情况下,您需要__cpp_lib_endian
。
现在库宏的问题是我们开始添加它们之前,我们添加了放置它们的位置-即__cpp_lib_endian
。如果您使用的是具有<version>
的编译器(它将是gcc 9+,带有libc ++的clang 7+,而我对MSVC则一无所知),则可以将其包括在内。但这可能不是,因此您可能还必须尝试包括正确的标头(在这种情况下为<version>
)。
<bit>
尽管这样做可能会更好:
#if __has_include(<bit>)
# include <bit>
# ifdef __cpp_lib_endian
# define HAS_ENDIAN 1
# endif
#endif
#ifdef HAS_ENDIAN
constexpr bool is_little_endian = std::endian::native == std::endian::little;
#else
constexpr bool is_little_endian = /* ... figure it out ... */;
#endif