You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 15:17:30