是否有一种更简单(更短)的方法将此代码段编写为循环:
for (auto [a, b]: {pair<int, int>{1, 2}, pair<int, int>{3, 4}})
foo(a, b);
最好使初始化列表尽可能地接近不编译的形式:
for (auto [a, b]: {{1, 2}, {3, 4}})
foo(a, b);
答案 0 :(得分:5)
由于C ++是一种强类型语言,因此您可以期望编译器推导的类型的模糊性受到限制。两个级别的未指定括号就是一个例子。
您可以使用简单的typedef将其缩短:
using pair_list = std::initializer_list<std::pair<int, int>>;
for (auto [a, b]: pair_list{{1, 2}, {3, 4}})
foo(a, b);
Live demo here。您可以根据需要优化/选择临时类型。
答案 1 :(得分:4)
由于演绎指南,您可以在C ++ 17中执行以下操作:
for (auto [a, b]: {std::pair{1, 2}, std::pair{3, 4}})
foo(a, b);
甚至
for (auto [a, b]: {std::pair{1, 2}, {3, 4}})
foo(a, b);
答案 2 :(得分:2)
有一个较短的方法可以完成,即构造临时std::map
。
您可以执行以下操作:
for (auto [a, b]: map<int, int>{{1, 2}, {3, 4}})
foo(a, b);
编译。见here。
或者按照@ Jarod42的建议,您也可以使用std::initializer_list<std::pair<int, int>>
。
for (auto [a, b]: std::initializer_list<std::pair<int, int>>{{1, 2}, {3, 4}})
您将不得不再输入一点。 :)
答案 3 :(得分:1)
仍然有些冗长,但是此模板可能会有所帮助:
template <class T>
constexpr auto asPairs(std::initializer_list<std::pair<T, T>> args)
{
return args;
}
它可以像以下实例化和使用。
for (auto [a, b] : asPairs<int>({{1, 2}, {3, 4}}))
foo(a, b);