ストーリーが少し長いです、この実装を簡素化するために++ 11月14日cを使用することです、元のコードのようにのようなものです:、それは整数のエンディアン普遍的な実装方法
#ifdef _BIG_ENDIAN_
#define ENDIANUSHORT(src) (unsigned short)src
#define ENDIANULONG(src) (unsigned long)src
#define ENDIANUINT64(src) (unsigned long long)src
#else
#define ENDIANUSHORT(src) ((unsigned short)((((src)>>8)&0xff) |\
(((src)<<8)&0xff00)))
#define ENDIANULONG(src) ((unsigned long)((((src)>>24)&0xFF) |\
(((src)>> 8)&0xFF00) |\
(((src)<< 8)&0xFF0000) |\
(((src)<<24)&0xFF000000)))
#define ENDIANUINT64(src) ((unsigned long long)((((src)>>56)&0xFF) |\
(((src)>>40)&0xFF00) |\
(((src)>>24)&0xFF0000) |\
(((src)>> 8)&0xFF000000) |\
(((src)<< 8)&0xFF00000000LL) |\
(((src)<<24)&0xFF0000000000LL) |\
(((src)<<40)&0xFF000000000000LL) |\
(((src)<<56)&0xFF00000000000000LL)))
#endif //_BIG_ENDIAN_
template<
typename T,
typename std::enable_if<std::numeric_limits<T>::is_integer>::type* = nullptr>
T _endian(T& t) {
if (sizeof(T) == 2)
return ENDIANUSHORT(t);
else if (sizeof(T) == 4)
return ENDIANULONG(t);
else if (sizeof(T) == 8)
return ENDIANUINT64(t);
return t;
}
template<typename T>
void endian(T& t) { t = _endian(t); }
int main()
{
long lv = 123;
endian(lv);
......
}
それはうまく動作しますが、そこになどのようなMSVCで警告されている:
static int64_t _endian(int64_t t) {
return ENDIANUINT64(t);
}
static uint64_t _endian(uint64_t t) {
return ENDIANUINT64(t);
}
static int32_t _endian(int32_t t) {
return ENDIANULONG(t);
}
static uint32_t _endian(uint32_t t) {
return ENDIANULONG(t);
}
static int16_t _endian(int16_t t) {
return ENDIANUSHORT(t);
}
static uint16_t _endian(uint16_t t) {
return ENDIANUSHORT(t);
}
static int8_t _endian(int8_t t) {
return t;
}
static uint8_t _endian(uint8_t t) {
return t;
}
:T _endian(T & t)は以下のコードと定義を置き換え :その後
warning C4293: '>>': shift count negative or too big, undefined behavior
はとして洗練しました
- 機能の実装が鈍い、冗長とinconciseです: 今警告なし
が、私が思うには、2つの欠点があります。
- たぶん、いくつかのケースは、私は、C++ 11月14日には、それを終了するエレガントで短い実装を提供することができると思い、あなたにどんな考えを持っている
をカバーされていませんか?
ありがとうございました。
あなたはブーストエンディアンライブラリに顔をしているしたい場合があります。 –
あなたの情報をありがとう。ブーストは非常に有名ですが、私の見解では、コードベースの実装を追加したくないので、私はブーストのファンではありません。 –
私は多くの不必要なコードを紹介するファンもいません。ちょうど彼らが何をしたか見てみましょう;-)#1と#2のために –