让程序中的简单if-else在编译期间决定
ex. 1 /*
2 * =====================================================================================
3 *
4 * Filename: 3.cpp
5 *
6 * Description:
7 *
8 * Version: 1.0
9 * Created: 03/01/2016 11:38:53 AM
10 * Revision: none
11 * Compiler: gcc
12 *
13 * Author: shih (Hallelujah), sh19871122@gmail.com
14 * Organization:
15 *
16 * =====================================================================================
17 */
18
19 #include <stdio.h>
20 #include <stdint.h>
21 #include <iostream>
22 #include <type_traits>
23
24 template<typename T>
25 struct is_swapable
26 {
27 static const bool value = std::is_integral<T>::value && sizeof(T) >= 2;
28 };
29
30 template<typename T>
31 T byte_swap(T value, std::true_type)
32 {
33 uint8_t *bytes = reinterpret_cast<uint8_t *>(&value);
34 for (std::size_t i = 0; i < sizeof(T)/2; ++i)
35 {
36 uint8_t v = bytes[i];
37 bytes[i] = bytes[sizeof(T) - 1 - i];
38 bytes[sizeof(T) -1 -i] = v;
39 }
40 return value;
41 }
42
43 template<typename T>
44 T byte_swap(T value, std::false_type)
45 {
46 return value;
47 }
48
49 template<typename T>
50 T byte_swap(T value)
51 {
52 return byte_swap(value, std::integral_constant<bool, is_swapable<T>::value>());
53 }
54
55 int main(int argc, const char *argv[])
56 {
57 int a = 0x11223344;
58 long b = 0x4455221112345678;
59 std::cout << std::hex << a << " " << b << std::endl;
60 std::cout << std::hex << byte_swap(a) << " " << byte_swap(b) << std::endl;
61 uint8_t c = 0x11;
62 char *d = "hello world";
63 std::cout << std::hex << byte_swap(c) << " " << byte_swap(d) << std::endl;
64 return 0;
65 }
66