例如
template<class Container, class List>
bool isEqual(Container const& c, List const& l)
{
return c == Container(l); // Error!!
}
并按
查看std::vector<int> v;
bool b = isEqual(v, {1, 2, 3});
但是我的代码出错了。没有从列表到容器的转换。如何解决这个问题?
答案 0 :(得分:3)
您目前编写的示例不仅因为比较而无法编译,还因为来自 braced-init-list List cannot be deduced >
将功能更改为
template<class Container, class T>
bool isEqual(Container const& c, std::initializer_list<T> const& l)
或改变你的称呼方式
std::vector<int> v;
auto l = {1, 2, 3};
bool b = isEqual(v, l);
// or
bool b = isEqual(v, std::initializer_list<int>{1, 2, 3});
要修正比较,正如Igor在评论中提到的那样,使用
return c.size() == l.size() && std::equal(std::begin(c), std::end(c), std::begin(l));
或者,如果您有权访问std::equal
的C ++ 14重载,它将开始和结束迭代器都带到两个范围,您可以跳过大小检查
return std::equal(std::begin(c), std::end(c), std::begin(l), std::end(l));