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
相关产品推荐
相关产品推荐

