12

I'm creating a class and I want to know how to create a constructor similar to the std::map or std::vector style.

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

The difference is that I don't want my class to ask for types that wants to accept, just like std::map does.

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

I want my class to accept that style of arguments:

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

But with defined type. (std::string, Typer)

The 'Typer' is a class that I will insert as value on the std::map.

2
  • You can't deduce initializer lists. Commented Feb 21, 2014 at 15:36
  • 1
    The simple answer is: use the map as the second parameter, as follows: const std::map<std::string, std::string>& data. In this case you can use your syntax for the second parameter. This is not a duplicate question, by the way. You needn't use an initializer list here. This works both in VS2013 and GCC 4.8.1. Commented Mar 2, 2014 at 10:54

2 Answers 2

24

If I understand your question correctly, you want a constructor taking std::initializer_list<std::pair<std::string, Typer>>, like this:

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

Sign up to request clarification or add additional context in comments.

Comments

3

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

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.