如何在std::apply的折叠表达式中捕获匹配状态与返回值?
解决方案:在std::tuple遍历中捕获匹配状态与函数返回值
你可以通过新增布尔变量跟踪匹配状态,同时利用C++折叠表达式的短路求值特性,找到匹配项后立即停止遍历。以下是修改后的完整代码:
#include <iostream> #include <tuple> using namespace std; class foo { public: foo(int i) : key_(i){} int get_key() { return key_; } int do_test() { std::cout << "ran test for key=" << key_ << "\n"; return -1; } private: int key_; }; int main() { std::tuple tup { foo{1}, foo{2}, foo{3}, foo{4}, foo{5}, foo{6}, foo{7}, foo{8} }; int key = 4; int fn_ret = 0; bool found_key = false; // 新增:跟踪是否找到匹配key std::apply( [key, &fn_ret, &found_key](auto&... args) { auto search_tuple = [key, &fn_ret, &found_key](auto& x) { if (found_key) { // 已找到匹配,直接返回true跳过后续项 return true; } int foo_key = x.get_key(); cout << "current key=" << foo_key << "\n"; if (foo_key == key) { std::cout << "found matching key, running test!\n"; fn_ret = x.do_test(); found_key = true; // 标记已找到 return false; // 返回false触发短路,终止后续遍历 } return true; // 未找到,继续遍历 }; // 折叠表达式:只要有一个search_tuple返回false,就停止后续调用 (search_tuple(args) && ...); }, tup ); // 验证结果 if (found_key) { cout << "匹配到key,do_test返回值:" << fn_ret << endl; } else { cout << "未找到匹配的key" << endl; } return 0; }
关键改动说明:
- 新增
found_key布尔变量,专门记录是否找到目标key; - 调整
search_tuple返回值为bool:- 未找到时返回
true,让折叠表达式继续遍历下一项; - 找到时返回
false,利用&&的短路求值特性,直接终止后续tuple元素的遍历; - 若已标记为
found_key,直接返回true跳过后续元素处理;
- 未找到时返回
- 最终可通过
found_key判断匹配状态,同时fn_ret保留do_test的返回结果。
这种方式既满足你的两个需求,还通过短路求值避免了不必要的遍历,提升了效率。
内容的提问来源于stack exchange,提问作者rookie
相关产品推荐
相关产品推荐

