是否有一个模板元程序来确定编译时编译器的字节顺序?

时间:2011-06-01 01:43:22

标签: c++ c boost

  

可能重复:
  Is there a way to do a C++ style compile-time assertion to determine machine's endianness?

我正在寻找一个Boost :: type_traits精神的模板元程序,它将返回编译器是大端还是小端。像is_big_endian<T>这样的东西。我怎么写这个?

使用它是通过基于字节序实现特定的模板特化来创建一个自动适应环境的库。例如,

template<>
void copy_big_endian_impl<true>(T *dst, const T *src, size_t sz) {
         // since already big endian, we just copy
         memcpy(dst, src, sz*sizeof(T));
}
template<>
void copy_big_endian_impl<false>(T *dst, const T *src, size_t sz) {
         for (int idx=0; idx<sz; idx++)
             dst[idx] = flip(src[idx];
}

这将允许将is_big_endian作为模板参数传递。

2 个答案:

答案 0 :(得分:5)

有一个Boost头文件定义了一个可以使用的宏:boost/detail/endian.hpp。没有必要使用模板元编程。

答案 1 :(得分:2)

如果你正在使用gcc(或clang),你可以使用预处理器变量 __ BYTE_ORDER __

#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
// little endian stuff
#else
// big endian stuff
#endif // __BYTE_ORDER__