std::initializer_list构造函数除了用值填充一些容器之外,还有什么用
What are std::initializer_list constructors used for, except for filling some container with values?
标准库中的一个主要而明显的含义是"用元素列表初始化集合":
std::vector<int> v = {1, 2, 3};
另一个含义可以在下面std::bitset上的链接后面找到——"单个值是由initializer_list的元素组装而成的"。
标准库中的第三个例子是std::piecewise_stant_distribution,但我不太确定它有什么语义,而不是一个元素集合。
std::initializer_list构造函数的其他用例是什么?如果可能的话,用真实代码中的例子。
这实际上是一个关于课堂设计的问题
由于列表初始化的一些特殊性,在现有的类中添加std::initializer_list构造函数很容易成为一个令人惊讶的突破性变化,因此在编写新类时,您应该始终提前知道它是否需要std::initializer_list构造函数
因此,我试图通过编写std::initializer_list构造函数的用例来模拟看到未来的能力。
主要的问题是:我如何确定我的类将来可能会有std::initializer_list构造函数(这对用户来说并不奇怪)来编写正确的非std::initializer_list构造函数?
我在当前的项目中实际使用了这种技术。我有一个类"BaseMenu",它需要在构造函数中初始化std::vector,所以它有std::vector作为参数。然后,我有继承自BaseMenu的MainMenu,我只告诉BaseMenu我想要我的MainMenu是什么样子:
BaseMenu(std::vector<std::string>);
MainMenu::MainMenu():
BaseMenu({{"Play"},
{"Options"},
{"About"},
{"Quit"}})
它真的很"舒服"。PS:上面的模型被简化了,但它应该给人一种std::initializer_list 的有用感
我认为initializer_list具有以下关键功能:
- 它将初始化概念封装在一个类中
- 该机制还提供了类型安全性,并避免了可能导致的任何转换信息丢失
- 它提供了唯一的const_iterator类型接口,因此可以对其进行读取优化,并且任何主体都不能对其进行更新/写入。这是有意义的,因为它旨在初始化其他对象
例如,您可能想参考我的博客和ISOCPP信息。
编辑
std::initializer_list 的可能优点
//1. Initialization Concept In A class
std::initializer_list<int> x{1,2,3,4,5};
std::vector<int> v(x.begin(), x.end());
//2.Better Type Safety and avoid narrow conversions scenario
std::vector<int> v{1, 2, 3.4, 4};
Compiler Output
narrowing conversion of ‘3.3999999999999999e+0’ from ‘double’ to ‘int’ inside { }
//3. Provide Const iterator type interface
std::initializer_list<int> ly{1,2,3,4,5};
auto itrs = ly.begin();
int* x = itrs;
Compiler Output
error: invalid conversion from ‘const int*’ to ‘int*’
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 警告处理为错误这里有什么问题
- 创建整数的 2D 数组,该数组将使用两个函数用随机数填充矩阵.我做错了什么?
- 究竟什么是"位填充"或"填充位"?
- 填充红黑树的最有效方法是什么?
- C++用用户输入在循环中填充 char 数组:输入整个字符串时到底发生了什么?
- 如果用零填充整个 RAM 会发生什么
- 从初始值设定项列表中填充boost::multi_array的最佳方法是什么
- 从原始数据填充成员的正确方法是什么
- 删除C结构末尾填充的最佳做法是什么
- 从QFile的内容填充QListView的最快方法是什么
- 在 c++ 中使用消息结构读取/填充数据缓冲区的正确方法是什么?
- 这个简单的木炭填充器有什么问题
- 创建 2D 数组并在每个数据槽中填充不同字符的最简单方法是什么?
- 在函数中填充结构映射的最好方法是什么?
- 什么是c#等效于c++ STL填充方法
- std::initializer_list构造函数除了用值填充一些容器之外,还有什么用
- 填充硬件输入结构以与 SendInput 一起使用的正确方法是什么
- 用向量来填充向量的有效方法是什么?
- 你认为是什么让这个C++代码变慢了?(它循环通过ADODB记录集,将COM类型转换为字符串,并填充ostringstre