V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
fyyz
V2EX  ›  C

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

  •  
  •   fyyz · 2016-06-29 11:51:36 +08:00 · 1727 次点击
    这是一个创建于 2865 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    先看看 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"},
    );
    
    8 条回复    2016-06-29 15:05:42 +08:00
    SuperFashi
        1
    SuperFashi  
       2016-06-29 12:27:38 +08:00 via Android
    fyyz
        2
    fyyz  
    OP
       2016-06-29 12:52:51 +08:00
    @SuperFashi
    可能是我没表达清楚。

    我说的是,假如说有一个 initialzer_list ,内部都是一个个花括号扩起来的元素,如何把这些花括号括起来的元素转变成 class 的实例化。
    jasonlz
        4
    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
        5
    fyyz  
    OP
       2016-06-29 14:24:06 +08:00
    @Archangel_SDY 谢谢你提供的范例,很简洁易懂 :)
    fyyz
        6
    fyyz  
    OP
       2016-06-29 14:58:57 +08:00
    @jasonlz 看一楼,我就是想用类似于 map 的方式来实现自己的函数。
    fyyz
        7
    fyyz  
    OP
       2016-06-29 15:01:03 +08:00
    @Archangel_SDY @jasonlz
    看了你们两个的范例,明白了,就是用构造函数。
    SuperFashi
        8
    SuperFashi  
       2016-06-29 15:05:42 +08:00 via Android
    @fyyz
    我说的是,你去看看那个网页下面有样例代码,如果你非要用 initializer_list 的话。

    还有,对于 class 的初始化完全可以直接用 4 楼的方式写出来,而且如果是 public 的话可以直接用(book){"book1", 1, "author1"}这种方式建立实例,然后用对 list 的普通操作例如 insert 或者 push_back 放到 book_list 里面。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2147 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 04:25 · PVG 12:25 · LAX 21:25 · JFK 00:25
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.