元编程_basic
1.
1 #include <iostream> 2 #define C11 1 3 4 template<int N> 5 class Fac 6 { 7 public: 8 #if C95 9 //enum { value = N * Fac<N-1>::value }; 10 #endif 11 #if C11 12 static inline constexpr auto value = N * Fac<N - 1>::value; 13 #endif 14 }; 15 16 17 template<> 18 class Fac<0> 19 { 20 public: 21 #if C95 22 //enum { value = 1 }; 23 #endif 24 #if C11 25 static inline constexpr auto value = 1; 26 #endif 27 }; 28 29 //---- <sqrt ---- 30 template<int N, int LO = 1, int HI = N> 31 struct Sqrt { 32 static constexpr auto mid = (LO + HI + 1) / 2; 33 static constexpr auto value = 34 (N < mid * mid) ? 35 Sqrt<N, LO, mid - 1>::value 36 : 37 Sqrt<N, mid, HI>::value; 38 }; 39 40 template<int N, int M> 41 struct Sqrt<N, M, M> { // 终止条件为LO和HI相等 42 static constexpr auto value = M; 43 }; 44 45 //---- sqrt/> ---- 46 47 int main() 48 { 49 std::cout << Fac<5> ::value << '\n'; 50 std::cout << Sqrt<16>::value << '\n'; 51 return 0; 52 }
2.
3.
3.1
constexpr的第一个作用:给编译器足够的信心在编译期去做被constexpr修饰的表达式的优化。
constexpr还有另外一个特性,虽然它本身的作用之一就是希望程序员能给编译器做优化的信心,但它却猜到了自己可能会被程序员欺骗,而编译器并不会对此“恼羞成怒”中止编译.
3.2
《C++ Templates 2nd》
other:在工程中的使用场景有限,毕竟即使能用上,也要考虑代码的可读性和维护性,否则反而会被当作炫技。最实用的场景,应该是用来写库
4.