给出这个示例类:
template<typename T>
class ExampleContainer
{
private:
std::map<T, int> _objects;
int _sum;
public:
ExampleContainer()
: _objects(), _sum(0)
{
}
void Add(T obj, int add)
{
_objects[obj] = add; // yes this is bad, but it's an example.
_sum += add;
}
};
能够像这样使用它需要什么:
ExampleContainer<char*> _rarities =
{
{ "One", 600 },
{ "Two", 200 },
{ "Three", 50 },
{ "Four", 10 },
{ "Five", 1 },
};
我知道它必须以某种方式成为可能,因为我可以像那样初始化一个std :: map。
提前感谢您的任何答案。
答案 0 :(得分:11)
只需向std::initializer_list
班级添加一个接受ExampleContainer
的构造函数:
ExampleContainer(std::initializer_list<typename std::map<T, int>::value_type> l)
:
_objects(l)
{
}
每次使用花括号初始化对象时都会调用此方法,如下例所示:
ExampleContainer<char*> _rarities =
{
...
};
这样,花括号内的每个条目都将成为初始化列表的一个元素。
由于此处初始化列表的基础类型为std::map<T, int>::value_type
,因此将根据您提供的值构建该类型的临时对象:
ExampleContainer<char*> _rarities =
{
{ "One", 600 }, // Each of these entires will cause the creation of
{ "Two", 200 }, // a temporary object of type:
{ "Three", 50 }, // std::pair<char* const, int>
{ "Four", 10 }, // that will become an element of the initializer
{ "Five", 1 }, // list received by the constructor.
};
另请注意,C ++ 03中字符串文字到char*
的转换已弃用,C ++ 11中无效(字符串文字)在C ++ 11中有类型char const[]
。因此,您可能希望将变量_rarities
改为ExampleContainer<char const*>
类型(C数组类型衰减为指针类型)。
更新:
正如@LightnessRacesInOrbit在评论中正确指出的那样,如果您不打算在容器中使用字符串文字,这种方法很危险(这是我从您的示例中假设的东西,但事实上没有任何暗示它) 。最好使用std::string
代替(因此您应将_rarities
声明为ExampleContainer<std::string>
)。