元编程_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 @   三岁玩童  阅读(59)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示