我有一个模板构造函数:
template <typename Edge>
Adjacency_list_directed(const std::initializer_list<Edge>& l) {
for (auto& edge : l) {
adj[edge.source][edge.dest] = edge.get_weight();
adj[edge.dest][edge.source] = edge.get_weight();
}
}
我想使用这些辅助构造函数结构:
template <typename V>
struct Weighted_edge {
V source;
V dest;
int weight;
// can't maintain as POD because V might not be POD
Weighted_edge(V u, V v, int w) : source{u}, dest{v}, weight{w} {}
int get_weight() const {return weight;}
};
template <typename V>
struct Unweighted_edge {
V source;
V dest;
Unweighted_edge(V u, V v) : source{u}, dest{v} {}
int get_weight() const {return 1;}
};
为了方便构造语法:
template <typename V>
using digraph = Adjacency_list_directed<V>;
sal::digraph<int> g {{1,2}, {2,3}, {3,4}, {4,1}};
然而,由于没有匹配功能(找不到Edge模板)而失败了
但这有效:
sal::digraph<int> g {Unweighted_edge<int>{1,2}, {2,3}, {3,4}, {4,1}};`
我认为这是因为没有边缘的显式顶点类型规范,编译器无法确定V是什么。它应该能够区分Unweighted_edge
和Weighted_edge
,因为它们需要不同数量的元素来构建。
有没有办法超过这个? (我尝试在未加权和加权边上创建2个非模板构造函数,但是这个错误是模糊的,你可以有多个initializer_list
构造函数但是有不同的类型吗?)