C++ 除了用值填充一些容器外,std::initializer\u list构造函数用于什么?
标准库中有一个主要而明显的含义——“用元素列表初始化集合”:C++ 除了用值填充一些容器外,std::initializer\u list构造函数用于什么?,c++,c++11,constructor,initializer-list,C++,C++11,Constructor,Initializer List,标准库中有一个主要而明显的含义——“用元素列表初始化集合”: std::vector v={1,2,3}; 在下面std::bitset上的链接后面可以找到另一个含义——“单个值是从初始值设定项\列表的元素组合而成的” 标准库中的第三个示例是std::piecewise_constant_distribution,但我不太清楚它有什么语义,而不完全是元素集合 std::initializer\u list构造函数的其他用例是什么?如果可能的话,用真实代码的例子 这实际上是一个关于课堂设计的问题
std::vector v={1,2,3};
在下面std::bitset上的链接后面可以找到另一个含义——“单个值是从初始值设定项\列表的元素组合而成的”
标准库中的第三个示例是std::piecewise_constant_distribution,但我不太清楚它有什么语义,而不完全是元素集合
std::initializer\u list构造函数的其他用例是什么?如果可能的话,用真实代码的例子
这实际上是一个关于课堂设计的问题。由于某些列表初始化操作可能会将std::initializer\u列表构造函数添加到现有类中,因此在编写新类时,您应该始终提前知道它是否需要std::initializer\u列表构造函数。
因此,我试图通过编写std::initializer\u list构造函数的用例来模拟看到未来的能力
主要的问题是:我如何确定我的类将来可能有(对用户来说并不奇怪)std::initializer\u list构造函数来编写正确的非std::initializer\u list构造函数呢?我在当前的项目中实际使用了这种技术。我有一个类“BaseMenu”,它需要在构造函数中初始化std::vector,所以它的参数是std::vector。然后,我有一个从BaseMenu继承的MainMenu,我只是告诉BaseMenu我想要我的MainMenu是什么样子:
BaseMenu(std::vector<std::string>);
MainMenu::MainMenu():
BaseMenu({{"Play"},
{"Options"},
{"About"},
{"Quit"}})
BaseMenu(std::vector);
MainMenu::MainMenu():
基本菜单({“播放”},
{“选项”},
{“关于”},
{“退出”})
它真的很“舒服”。
PS:上面的模型被简化了,但它应该给人一种std::initializer\u list有用的感觉我认为initializer\u 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*’
//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*’
//1。类中的初始化概念
std::初始值设定项_列表x{1,2,3,4,5};
向量v(x.begin(),x.end());
//2.更好的类型安全性,避免狭窄的转换场景
std::向量v{1,2,3.4,4};
编译器输出
正在缩小{}内“3.399999999999e+0”从“double”到“int”的转换范围
//3. 提供常量迭代器类型接口
std::初始值设定项_listly{1,2,3,4,5};
自动itrs=ly.begin();
int*x=itrs;
编译器输出
错误:从“常量int*”到“int*”的转换无效
我的措辞(或英语)可能有些问题,因为您和用户3496846都回答了一些我没有回答的问题asked@user2665887:我想你想通过实例来了解Initializer_列表用例/优势。我已经用实例更新了我的帖子。希望你会发现它很有用。所有人都尊重你,但是你问了一个非常开放的问题,所以当你得到各种各样的答案时,这应该是毫不奇怪的!你最好的办法是在互联网上搜索例子,或者找到一个C++ 11的好的C++书籍。如果你问这样一个问题,很难预测你会得到什么答案。嗯,我对这个问题做了一些编辑,不确定它是否正确helps@user2665887当前位置我建议您查看标准库类并遵循相同的操作。一般来说,容器类型类应该有一个构造函数,可以使用初始值设定项列表(如数组、向量、列表、映射……)初始化该构造函数。对于非容器类型,不要编写这样的构造函数(iostream…)。这是标准中通常遵循的一般规则,所以我们也应该遵循同样的规则。