2011-06-01 62 views
4

可能重複:
Is there a way to do a C++ style compile-time assertion to determine machine's endianness?有沒有一個模板元程序來確定在編譯時編譯器的字節順序?

我在升壓:: 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作爲模板參數傳遞。

+0

你可能需要的不是元編程,但老式的宏。體系結構特定的頭文件通常包含這種信息,也許有一個boost頭文件,它可以通過跨平臺方式獲取。 – 2011-06-01 01:47:02

回答

5

有一個Boost頭文件定義了一個宏,您可以使用:boost/detail/endian.hpp。沒有必要訴諸模板元編程。

2

如果你正在使用gcc(或鐺),你可以使用預處理變量__BYTE_ORDER__

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