C++ lambda 返回自己
C++ lambda returning itself
我想写一个返回自身的lambda,这样我就可以当场多次调用它。但是看起来在lambda内部this
指的是lambda,而是指周围对象的this
,如果lambda是在成员函数中定义的。
下面是一个示例:
#include <iostream>
int main(int argc, char* argv[]) {
int a = 5;
[&](int b) {
std::cout << (a + b) << std::endl;
return *this;
}(4)(6);
}
有没有办法做一些类似的事情?
使用旧函子:
int main() {
int a = 5;
struct S {
const S& operator ()(int b) const {
std::cout << (a + b) << std::endl;
return *this;
}
const int& a;
};
S{a}(4)(6);
}
演示
你不能返回 lambda 本身,但你可以返回一个不同的:
#include <iostream>
int main() {
int a = 5;
[&](int b) {
auto impl = [&](int b){std::cout << (a + b) << std::endl;};
impl(b);
return impl;
}(4)(6);
}
但是,这只允许再调用一次。不确定是否有一些技巧可以从中获得更多...
Ben Voigt 建议使用 Y 组合子(这对标准库 BTW 来说是一个很好的建议(,但你的问题更简单。您可以引入一个小的模板函子来代替 lambda:
template<typename T>
struct recallable_impl {
template<typename... Args>
recallable_impl& operator()(Args&&... args) {
f(std::forward<Args>(args)...);
return *this;
}
template<typename F>
recallable_impl(F&& f)
: f{std::forward<F>(f)}
{}
private:
T f;
};
template<typename T>
decltype(auto) recallable(T&& f) {
return recallable_impl<std::decay_t<T>>(std::forward<T>(f));
}
然后,您的 lambda 甚至不需要显式返回任何内容:
int main() {
int a = 5;
recallable([&](int b){std::cout << (a + b) << std::endl;})(4)(5)(6)(7)(8);
}
如果您将lambda 分配给预置类型(不是 auto(,则可以调用它,并且它会被捕获:
std::function<void(int)> f =[&f](int n)
{
if (n>0) f(n-1);
return;
};
相关文章:
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- 什么时候在C++中返回常量引用是个好主意
- 你能重载对象变量名本身返回的内容吗
- 为什么 Serial.println(<char[]>);返回随机字符?
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- C++ lambda 返回自己
- 返回自己的类型的模板类方法的正确签名
- 函数可以将指针返回其自己的类型
- 我创建了自己的智能指针类,我用这个智能指针指向一个类实例,如何正确返回智能指针
- 如何在 c++ 中返回我自己的结构
- LIBSVM SVM 在如何使用我自己(不带"svmpredict")与从"svmtrain"返回的参数
- C++ std::函数,返回它自己的类型(再次递归类型)
- 从 MapViewOfFile() 的返回值构造自己的对象
- 使clang格式允许函数在自己的行上返回类型
- 如何从Oracle的过程中返回我自己的结构的数组/记录集?
- 对象在返回之前破坏自己?c++
- abi::__cxa_demangle 不能重用自己返回的内存
- 为什么采用向量的方法不能采用自己输出的返回向量?
- 递归typedef函数定义:std::函数返回自己的类型
- 返回的结构调用它自己的析构函数,用于销毁分配的对象