template<int size>
inline void* byteswap(void* __x);
template<>
inline void* byteswap<2>(void* __x)
{
return (*(uint16*)__x >> 8) | (*(uint16*)__x << 8);
}
template<>
inline void* byteswap<4>(void* __x)
{
return (byteswap<4>(__x & 0xffff) << 16) | (bswap_16 (__x >> 16));
}
template<typename T>
inline T byteswap(T& swapIt)
{
return (T*)byteswap<sizeof(T)>(swapIt);
}
int main() {
uint32 i32 = 0x01020304;
uint16 i16 = 0x0102;
byteswap(i32);
byteswap(i16);
return 0;
}
Выше, очевидно, даже не компилируется.Я в замешательстве, так как мне кажется, что мне нужен void * в качестве параметра для функции, и все это становится неприятно в byteswap <4>, когда мне нужно вызвать byteswap <2>, но со ссылкой.
Любая идея, какчтобы это выглядело красиво?Возможно ли добиться этого (используя встраивание или другие приемы), чтобы сделать его таким же быстродействующим, как и непосредственное выполнение битовых операций?