-
-
[分享]《探索现代化C++》泛读笔记摘要6
-
发表于: 2022-9-12 09:17 4407
-
《探索现代化C++》泛读笔记摘要6
Chapter 3 通用编程
命名空间和函数查找
在头文件中建议不要引入名字或在函数外引入命名空间。
命名空间也可以有别名
1 2 | namespace lname = long_namespace_name; namespace dvector = algebra::vector::dense; |
C++17 支持打开嵌套的命名空间
1 2 3 | namespace algebra::vector::dense{ class vector3 { / * * / }; } |
ADL 依赖于参数的查询。
类模板
对于像指针一样的对象,C++提供了像指针一样的接口,从而巧妙地构思出来了迭代器。
类型推导和定义
C++11 自动变量类型 auto
1 | auto a = f(g(x,y,z) + 3 * x); |
C++11 表达式的类型 decltype
1 | decltype(f(g(x,y,z) + 3 * x)) a = f(g(x,y,z) + 3 * x); |
C++11 decltype(auto)
1 2 | decltype(expr) v = expr; / / 当表达式很长时,写这种语句就显得比较冗余 decltype(auto) v = expr; / / 这种形式简化了书写 |
例子
1 2 3 4 5 6 7 8 | int main() { using Vec = vector<double>; Vec v = { 2.3 , 8.1 , 9.2 }; value_range_vector<Vec> w{v, 1.0 , 10.0 }; decltype(auto) val = w[ 1 ]; } |
C++17 推导类模板参数
1 2 | tuple < int , float ,string> t1( 3 , 3.2f , "text" s); / / C + + 17 以前的写法 tuple t2( 3 , 3.2f , "text" s); / / c + + 17 自动完成了类模板的推导 |
有些时候我们可以提供默认类型
1 2 | template<typename Value = double> struct vec; |
或者提供推导指南帮助编译器
1 | vec(unsigned s) - > vec<double>; |
C++17 推导多种类型, 使得函数能返回多个值。
当函数返回值是多个结果,比如说pair,tuple,或者用户定义的类时,就会出现这种情况。
1 2 3 4 5 6 7 | auto lu(const matrix& A) { / / ... some computations return tuple <matrix,vector>(LU,p); } auto [Lu, p] = lu(A); |
第二个例子 map
1 2 3 4 5 6 | map <string, int > numbers = {{ "Zeros" , 0 },{ "One" , 1 },{ "Two" , 2 }}; for ( const auto&[key,value] : numbers) cout<<key<< "->" <<value<<endl; for (auto& [key,values]:numbers) cout<<key<< "->" <<value<<endl; |
第三个例子 用户自定义的类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | struct lu_result { matrix LU; vector p; }; auto lu(const matrix& A) { / / ... return lu_result{LU,p}; } matrix A; / / set A ... auto [Lu,p] = lu(A); |
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
最后于 2022-9-12 22:05
被VirtualCC编辑
,原因: 章节错误
赞赏
他的文章
- 定位Windows分页结构内存区域 6915
- [原创]2022年,工业级EDR绕过蓝图 28273
- [分享]《探索现代化C++》泛读笔记摘要20 完! 7310
- [分享]《探索现代化C++》泛读笔记摘要19 7562
- [原创]摘微过滤驱动回调的研究-续 10163
看原图
赞赏
雪币:
留言: