有没有更简单(更短)的方法将此代码片段写成循环形式:
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);
有没有更简单(更短)的方法将此代码片段写成循环形式:
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);
using pair_list = std::initializer_list<std::pair<int, int>>;
for (auto [a, b]: pair_list{{1, 2}, {3, 4}})
foo(a, b);
这里有实时演示。您可以根据需要优化/选择临时类型。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::
,你的解决方案是最简洁和灵活的。 - Paul Jurczakfor (auto [i, j, k]: {tuple{.1, .5, 5}, tuple{.4, .5, 6}})
- Paul Jurczakstd::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}})
std::initializer_list<std::pair<int, int>>
也可以完成这个任务。 - Jarod42map<int, int>
看起来不错,但在内部循环中可能会降低性能。 - Paul Jurczak这个模板或许能帮上忙:
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);