2017-03-10 20 views
5

Tôi có một bộ sưu tập định nghĩa là -vector - ghép nối thống nhất khởi

using Parameters = std::vector<int>; 
using Group = std::pair<std::string, Parameters>; 
std::vector<Group> inputs; 

Ý định của tôi là sử dụng những câu như

inputs.push_back(group0 /*What goes in here ?*/); 
inputs.push_back(group1 /*What goes in here ?*/); 

Làm thế nào tôi có thể khởi tạo group0group1 sử dụng danh sách initializer? Mã này như thế này dường như không làm việc

inputs.push_back(std::make_pair("group0", {1, 2, 3, 4})); 

EDIT: Có câu hỏi đã tồn tại trên vector cặp khởi nhưng tôi không thể nhìn thấy bất cứ nơi second của std::pair lại là một bộ sưu tập .

+1

Hãy nhìn vào [ 'vector :: emplace_back()'] (http://www.cplusplus.com/reference/vector/vector/emplace_back/). Nó xây dựng tại chỗ tức là bạn có thể truyền các đối số trực tiếp và cá thể của 'Nhóm' được xây dựng tại nơi lưu trữ" cuối cùng ". – Scheff

Trả lời

10

Khi bạn viết inputs.push_back(std::make_pair("group0", {1, 2, 3, 4})), bạn đang yêu cầu make_pair để suy ra các loại của cả hai đối số của nó. Nhưng đối số thứ hai, braced-init-list, không phải là một biểu thức, do đó, nó không có loại. Do đó, khấu trừ đối số mẫu không thành công.

Giải pháp đơn giản nhất là xóa cuộc gọi đến make_pair và sử dụng braced-init-lists ở mọi nơi.

inputs.push_back({"group0", {1, 2, 3, 4}}); 

Bây giờ, danh sách khởi tạo sẽ enumerate available constructors và gọi các nhà xây dựng pair với cặp ngoài của đối số, và vector constructor cho khu vực nội chuẩn bị tinh thần-init-list.

1

Trong khi

inputs.push_back({"group0", {1, 2, 3, 4}}); 

hoạt động chính xác cho những gì bạn định làm, tôi nghĩ rằng đó là biểu cảm hơn để sử dụng:

inputs.push_back(std::make_pair("group0", Parameters{1, 2, 3, 4}));