什么是基于范围的循环在几个元组上迭代的简明表示法



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

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

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

现场演示。您可以根据需要优化/选择临时工的类型。

多亏了推导指南,您可以在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);

有一种较短的方法,即构建临时std::map

你可以这样做:

for (auto [a, b]: map<int, int>{{1, 2}, {3, 4}})
foo(a, b);

这会编译。请在此处查看。

或者,正如@Jarod42所建议的,您也可以使用std::initializer_list<std::pair<int, int>>

for (auto [a, b]: std::initializer_list<std::pair<int, int>>{{1, 2}, {3, 4}})

您将不得不再键入一点。:(

仍然有点冗长,但这个模板可能会有所帮助:

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

最新更新