C++之initializer_list,可变参数模板参数展开方法
initializer_list介绍
模板initializer_list是C++11新增的,可以使用初始化列表语法将STL容器初始化为一系列值,在使用 { }来进行初始化的时候,其实是调用了将 initializer_list < T > 作为参数的构造函数。
使用列表初始化可以让容器如同数组一般被初始化,除此以外,实现以std::initializer_list为形参
的构造函数也非常容易,这使自定义容器支持列表初始化也变得十分简单。
可变参数模板参数展开方法
递归的展开方法
要定义递归开始函数和结束函数,比较繁琐
void print(){}
template<typename T>
void print(T t)
{cout << t << endl;
}
template<typename T, typename... Args>
void print(T t, Args... args)
{print(t);print(args...);
}
int main() {print(1);print(1, 2);print(1, 2, 3);
}
使用initializer_list 配合 lambda和逗号表达式展开
template<typename... Args>
void print(Args... args)
{std::initializer_list<int>{([&]{cout << args
<< endl; }(), 0)...};
}
使用初始化列表需要注意的事项
如果有一个类同时拥有满足列表初始化的构造函数,且其中一个是以 std::initializer_list 为参数,那么编译器将优先以 std::initializer_ list 为参数构造函数。例如:
std::map<std:: string, int> x8{ {"bear",4},{"cassowary",2}, {"tiger",7} }
内层括号和外层括号使用的构造函数是不一样的,内层的 {“bear”,4} 等隐式调用的是 std::pair(const T1& x, const T2& y) 构造函数,而外层调用的是std::map的构造函数 map(std::initializer_list<value_ type>init, const Allocator&)
指定初始化
struct Point3D {int x;int y;int z;
};
Point3D p{ .z = 3 }; // x = 0, y = 0
C++之initializer_list,可变参数模板参数展开方法相关推荐
- C++可变参数模板的展开方式
文章目录 前言 可变参数模板的定义 参数包的展开 递归函数方式展开 逗号表达式展开 enable_if方式展开 折叠表达式展开(c++17) 总结 前言 可变参数模板(variadic templat ...
- 【C++】C++11新特性——可变参数模板|function|bind
文章目录 一.可变参数模板 1.1 可变参数的函数模板 1.2 递归函数方式展开参数包 1.3 逗号表达式展开参数包 1.4 empalce相关接口函数 二.包装器function 2.1 funct ...
- C++_可变参数模板到emplace_back再到construct再到forward
C++_可变参数模板到emplace_back再到construct再到forward 1.可变参数模板 具体定义如下图所示: 编写一个可变参数版本: 1.1sizeof-运算符 2.emplace_ ...
- 可变参数模板、右值引用带来的移动语义完美转发、lambda表达式的理解
可变参数模板 可变参数模板对参数进行了高度泛化,可以表示任意数目.任意类型的参数: 语法为:在class或者typename后面带上省略号. Template<class ... T> v ...
- 可变参数模板(参考《C++ Templates 英文版第二版》)
可变参数模板(参考<C++ Templates 英文版第二版>) Chapter 4 可变参数模板 自从C++11,模板可以接受可变数量的参数 4.1 可变参数模板 可以定义模板,去接受无 ...
- C++11 -------- 类的新功能+可变参数模板+emplace接口
目录 类的新功能 1.默认成员函数 (1)八个默认成员函数 (2)默认移动构造和移动赋值的生成条件 (3)默认生成的移动构造和移动赋值会做什么 (4)验证默认生成的移动构造和移动赋值所做的工作 2.类 ...
- 3.4 参数展开-机器学习笔记-斯坦福吴恩达教授
参数展开(Unrolling Parameters) 在神经网络的学习过程中,我们的工作对象面临的是一些矩阵: Θ(1),Θ(2),Θ(3),...Θ^{(1)},Θ^{(2)},Θ^{(3)},.. ...
- C++ Variadic Templates(可变参数模板)
本文参考侯捷老师的视频:https://www.youtube.com/watch?v=TJIb9TGfDIw&list=PL-X74YXt4LVYo_bk-jHMV5T3LHRYRbZoH ...
- C++ 0x 使用可变参数模板类 实现 C# 的委托机制
1 #ifndef _ZTC_DELEGATE_H_ 2 #define _ZTC_DELEGATE_H_ 3 4 #include <vector> 5 #include <fun ...
最新文章
- 大数据引发的风险与管控
- Android应用的基本组件介绍
- linux调用odbc接口乱码,linux中pypyodbc读取GB编码mdb中文乱码解决办法
- iOS开发Cocoapods执行命令pod setup,执行失败解决RPC failed; curl 56 LibreSSL SSL_read: SSL_ERROR_SYSCALL, errno 54
- IK和pinyin分词器
- 电脑如何设置u盘启动,u盘启动项设置方法
- 文字检测识别系统SDK
- The captain题目回顾
- Flixel横板游戏制作教程(五)— Enemies
- 抖音收购musical.ly后,最难过的为什么是快手?
- js 实现网页内容语音朗读功能
- sgu207:Robbers(贪心)
- 空间数据挖掘中的Skyline查询
- Intellij IDEA2019版激活方式
- 最小编辑距离 (MED)实现-Python
- 初识项目与项目管理-1
- 华钜同创:亚马逊滞销产品快速清仓的方法!
- 云平台车载终端开发项目日志
- pytorch earlystopping使用
- 【转】区块链公链的 3 大性能难点、5 大体验障碍