2014-02-21 3 views
11

Я создаю класс, и я хочу знать, как создать конструктор, похожий на стиль std::map или std::vector.Конструктор, похожий на std :: map или std :: vector в классе

std::map<std::string, std::string> map = { 
    {"foo", "bar"}, 
    {"biz", "buz"}, 
    {"bez", "boz"} 
}; 

Разница заключается в том, что я не хочу, чтобы мой класс, чтобы попросить типов, которые хочет принять, так же, как std::map делает.

std::map<std::string, std::string> 

Я хочу, чтобы мой класс, чтобы принять этот стиль аргументов:

{ 
    {"foo", "bar"}, 
    {"biz", "buz"}, 
    {"bez", "boz"} 
}; 

Но с определенным типом. (std :: string, Typer)

«Typer» - это класс, который я буду вставлять как значение на std::map.

+0

Вы не можете выводить списки инициализатора. –

+1

Простой ответ: используйте карту в качестве второго параметра, следующим образом: const std :: map & data. В этом случае вы можете использовать свой синтаксис для второго параметра. Между прочим, это не дублирующий вопрос. Здесь не обязательно использовать список инициализаторов. Это работает как в VS2013, так и в GCC 4.8.1. –

ответ

23

Если я правильно понимаю ваш вопрос, вы хотите конструктор, std::initializer_list<std::pair<std::string, Typer>>, как это:

struct Typer 
{ 
    std::string data; 

    Typer(const char *s) : data(s) {} 
}; 


struct MyClass 
{ 
    MyClass(std::initializer_list<std::pair<std::string, Typer>> i) 
    : myMap(begin(i), end(i)) 
    {} 

    std::map<std::string, Typer> myMap; 
}; 

int main() 
{ 
    MyClass m = { 
    {"foo", "bar"}, 
    {"biz", "buz"}, 
    {"bez", "boz"} 
    }; 
} 

Live example

3

typedef std::map<std::string, Typer> MyType;

Смежные вопросы