C ++プログラミングの世界で時々出てくる一般的な質問は、コンパイル時のエンディアンの決定です。通常、これはほとんど移植性のない#ifdefで行われます。しかし、C ++ 11constexpr
キーワードとテンプレートの特殊化は、これに対するより良い解決策を提供しますか?
次のようなことを行うのは合法的なC++11でしょうか?
constexpr bool little_endian()
{
const static unsigned num = 0xAABBCCDD;
return reinterpret_cast<const unsigned char*> (&num)[0] == 0xDD;
}
次に、両方のエンディアンタイプのテンプレートを特殊化します。
template <bool LittleEndian>
struct Foo
{
// .... specialization for little endian
};
template <>
struct Foo<false>
{
// .... specialization for big endian
};
そして、次のことを行います。
Foo<little_endian()>::do_something();