2

我的 Graph 构造函数:

Graph(std::initializer_list<Edge> list);

我的边缘构造函数:

Edge(int out, int in);

我想通过以下方式创建我的图表:

Graph g = { (1,2), (3,4), (5,1), (5,3)};

但如果我写的话,我只想要一个成功的编译:

Graph g = { Edge(1,2), Edge(3,4), Edge(5,1), Edge(5,3)};

如何在没有“Edge”字样的 initializer_list 中创建 Edge?

4

3 回答 3

6

用于{}初始化每个成员;这将选择两个参数的构造函数,假设没有构造函数采用initializer_list.

Graph g = { {1,2}, {3,4}, {5,1}, {5,3} };

但是,我发现这不适用于一些较旧的编译器,在这种情况下,您可能不得不回退到编写Edge.

于 2013-05-17T13:29:21.567 回答
1

你不能用括号来做到这一点,但你可以使用统一的初始化语法(即使用大括号)。

您所需要的只是一个构造函数,Edge它接受两个整数(您已经拥有)和 astd::initializer_list<Edge>作为Graph' 构造函数的唯一参数(您几乎拥有,只是缺少模板参数):

#include <initializer_list> // FOR std::initializer_list

struct Edge
{
    Edge(int out, int in) { /* ... */ }

    // Do not put any constructor taking an std::initalizer_list here,
    // otherwise it will be picked instead of the one above when using
    // uniform initialization syntax.

    // ...
};

struct Graph
{
    Graph(std::initializer_list<Edge> list) { /* ... */ }

    // ...
};

然后,您可以按如下方式构建图表:

int main()
{
    Graph g1 = { {1,2}, {3,4}, {5,1}, {5,3} };
    Graph g2 = { Edge(1,2), Edge(3,4), Edge(5,1), Edge(5,3) };
    Graph g3 = { Edge{1,2}, Edge{3,4}, Edge{5,1}, Edge{5,3} };
}

这是一个编译的实时示例

于 2013-05-17T13:30:06.367 回答
0

您使用的是括号而不是大括号:

Graph g = { {1,2}, {3,4}, {5,1}, {5,3}};

这实际上会调用Graph's构造函数来获取std::initializer_list.

于 2013-05-17T13:28:30.693 回答