gpt4 book ai didi

c++ - 如何为我自己的集合类启用大括号括起来的初始化列表?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:10:49 25 4
gpt4 key购买 nike

给定这个示例类:

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 了。

提前感谢您的回答。

最佳答案

只需添加一个接受 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.
};

另请注意,从字符串文字到 char* 的转换在 C++03 中已弃用,在 C++11 中无效(字符串文字在 C++11 中的类型为 char const[])。因此,您可能希望给变量 _rarities类型 ExampleContainer<char const*>相反(C 数组类型衰减为指针类型)。

更新:

正如@LightnessRacesInOrbit 在评论中正确指出的那样,如果您不打算在容器中仅使用字符串文字,这种方法是危险的(这是我从您的示例中假设的,但实际上没有任何暗示) .最好使用 std::string相反(因此您应该将 _rarities 声明为 ExampleContainer<std::string> )。

关于c++ - 如何为我自己的集合类启用大括号括起来的初始化列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14923711/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com