You need to enable JavaScript to run this app. C++中如何处理依赖递归lambda与仿函数的模板参数声明及传递问题
优惠活动
大模型
产品
解决方案
定价
更多

C++中如何处理依赖递归lambda与仿函数的模板参数声明及传递问题

lambda自作用域实现的类型传递问题

我正在尝试构建一套简洁优雅、支持递归能力的lambda自作用域实现,技术本质接近Y组合子,但严格来说并不完全等同。探索过程中我查阅了大量相关技术资料,梳理了多类公开实现的逻辑细节。

我把遇到的核心问题尽可能精简呈现:我们该如何传递、使用以lambda作为模板参数的模板化仿函数?

下面是可复现问题的最小代码片段:

#include <string>
#include <iostream>
#define uint unsigned int

template <class F>
class Functor {
public:
    F m_f;

    template <class... Args>
    decltype(auto) operator()(Args&&... args) {
        return m_f(*this, std::forward<Args>(args)...);
    }
};
// 自定义类模板推导指引
template <class F> Functor(F)->Functor<F>;

class B {
private:
    uint m_val;
public:
    B(uint val) : m_val(val) {}
    uint evaluate(Functor<decltype([](auto & self, uint val)->uint {})> func) const {
        return func(m_val);
    }
};

int main() {
    B b = B(5u);
    Functor f = Functor{[](auto& self, uint val) -> uint {
        return ((2u * val) + 1u);
    }};

    std::cout << "f applied to b is " << b.evaluate(f) << "." << std::endl;
}

上述代码无法正常编译运行,Visual Studio会报错提示:调用b.evaluate(f)时,传入的对象f与方法的形参类型不匹配。
我推测问题根源是auto & self的泛型推导机制无法满足固定形参的类型匹配要求,想要明确这类问题的解决方案:

  • 当这类对象的类型本质上无法被显式定义时,我们该如何存储、传递它们?
  • 很多Y组合子实现中存在的特殊双层包装结构,是否正是为了解决这类问题?

内容的提问来源于stack exchange,提问作者Stefan Bauer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.05 20:27:04