元编程_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.

 

posted @ 2021-01-03 17:40  三岁玩童  阅读(58)  评论(0编辑  收藏  举报