【发布时间】:2021-01-17 15:54:35
【问题描述】:
假设我有一些像下面这样的简单代码,它只打印一个元组中的所有值并跟踪当前迭代。
#include <iostream>
#include <tuple>
#include <utility>
using std::cout;
int main() {
std::tuple<int, double, size_t, unsigned, short, long long, long> my_tuple(7, 4, 1, 8, 5, 2, 9);
//Can you spot the pattern? :)
std::apply(
[](auto&&... current_value) {
size_t i = 0; //This is only executed once
((
cout << i++ << ", " << current_value << "\n" //This is repeated the length of the tuple
), ...);
}, my_tuple
);
return 0;
}
例如,如果我想仅在索引大于 2 时打印元组值,我该怎么做?我不能简单地将if 放在cout 之前,因为不允许使用语句(repl.it 上有[cquery] expected expression)。
更一般地说,如何在包扩展中执行多行代码或语句之类的操作?
在内部使用 lambda,例如
std::apply(
[](auto&&... current_value) {
size_t i = 0;
((
[¤t_value, &i](){
cout << i << ", " << current_value << "\n";
++i;
}()
), ...);
}, my_tuple
);
但我无法想象这是最有效(或预期)的解决方案。
【问题讨论】:
-
实际上 lambda 可能是最好的方法。一个好的 C++ 编译器可能能够内联 lambda。
标签: c++ lambda c++17 stdapply pack-expansion