对于基于范围迭代几个元组的范围的简洁表示法是什么

时间:2018-11-23 10:18:28

标签: c++ c++17

是否有一种更简单(更短)的方法将此代码段编写为循环:

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

4 个答案:

答案 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);