initialzer_list 怎么实现类似 map 的列表传参?

2016-06-29 11:51:36 +08:00
 fyyz

标题里不大讲得清楚,所以就在这里详细说一下。

先看看 map 列表赋值:

map<char,string> escape_map = {
	{'1',"11"},
	{'2',"22"},
	{'3',"33"},
};

我知道 map 内部的元素其实是 pair<T1,T2>,现在我也想自己实现一个类似的玩意,细节是这样的(不是原始需求,为了说清楚做了改动)。

首先有一个 class :

class book
{
	string bookname;
	double price;
	string author;
};

然后我需要实现一个函数,通过列表传参把这些 book object 写入一个 list 。

class book
{
	string bookname;
	double price;
	string author;
};

list<book> book_list;

void add_book(initialzer_list<book> _book_list)
{
	//这里卡住了
	//如何把 initialzer_list 里的花括号括起来的元素转变成 book object ?
	//就像 map 的 initialzer_list 里把花括号里的元素转变为 pair?
}

add_book(
	{"book1",1,"author1"},
	{"book2",2,"author2"},
);
1846 次点击
所在节点    C
8 条回复
SuperFashi
2016-06-29 12:27:38 +08:00
fyyz
2016-06-29 12:52:51 +08:00
@SuperFashi
可能是我没表达清楚。

我说的是,假如说有一个 initialzer_list ,内部都是一个个花括号扩起来的元素,如何把这些花括号括起来的元素转变成 class 的实例化。
Archangel_SDY
2016-06-29 13:51:55 +08:00
jasonlz
2016-06-29 13:59:29 +08:00
首先是 initializer_list ,拼写错误。
然后 initializer_list<T> 花括号里的值是需要实例化的,你的需求是用未实例化的 initializer_list<T>来实例化每个 T 元素?这显然是违规操作。
不知道你的目的是什么,如果是想通过 initializer_list 来初始化一组 T ,你可以这样:
class book
{
string bookname;
double price;
string author;
public:
book(string _bookname, double _price, string _author):
bookname(_bookname), price(_price), author(_author) {}
};

list<book> book_list{
new book("book1",1,"author1"),
new book("book2",2,"author2") };
fyyz
2016-06-29 14:24:06 +08:00
@Archangel_SDY 谢谢你提供的范例,很简洁易懂 :)
fyyz
2016-06-29 14:58:57 +08:00
@jasonlz 看一楼,我就是想用类似于 map 的方式来实现自己的函数。
fyyz
2016-06-29 15:01:03 +08:00
@Archangel_SDY @jasonlz
看了你们两个的范例,明白了,就是用构造函数。
SuperFashi
2016-06-29 15:05:42 +08:00
@fyyz
我说的是,你去看看那个网页下面有样例代码,如果你非要用 initializer_list 的话。

还有,对于 class 的初始化完全可以直接用 4 楼的方式写出来,而且如果是 public 的话可以直接用(book){"book1", 1, "author1"}这种方式建立实例,然后用对 list 的普通操作例如 insert 或者 push_back 放到 book_list 里面。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://tanronggui.xyz/t/289072

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX