使用<Edge>initializer_list C++图形 - 如何在没有"Edge"字的情况下在initializer_list创建边缘?

Graph with initializer_list<Edge> C++ - How I do to create Edges at initializer_list without "Edge" word?

本文关键字:list initializer Edge 创建 边缘 情况下 C++ gt lt 图形 使用      更新时间:2023-10-16

My Graph constructor:

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

My Edge构造函数:

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)};

我如何在没有"边缘"字的initializer_list中创建边缘?

使用{}初始化每个成员;如果没有接受initializer_list的构造函数,它将选择双参数构造函数

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

但是,我发现这在一些旧的编译器上不起作用,在这种情况下,您可能不得不返回到编写Edge

您不能使用圆括号,但使用统一的初始化语法(即使用大括号)可以。

你所需要的是一个Edge的构造函数,它接受两个整数(你已经有了)和一个std::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} };
}

下面是一个编译的实例

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

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

这将实际调用Graph's构造函数,接受std::initializer_list