C++11 个 lambda 到函数指针
C++11 lambdas to Function Pointer
我开始使用 C++11 lambda 开发应用程序,并且需要将某些类型转换为函数指针。这在GCC 4.6.0中完美运行:
void (* test)() = []()
{
puts("Test!");
};
test();
我的问题是当我需要在 lambda 中使用函数或方法局部变量时:
const char * text = "test!";
void (* test)() = [&]()
{
puts(text);
};
test();
G++ 4.6.0 给出了转换错误代码:
main.cpp: In function 'void init(int)':
main.cpp:10:2: error: cannot convert 'main(int argc, char ** argv)::<lambda()>' to 'void (*)()' in initialization
如果使用自动,它可以正常工作:
const char * text = "Test!";
auto test = [&]()
{
puts(text);
};
test();
我的问题是:如何使用 [&] 为 lambda 创建类型?就我而言,我不能使用 STL std::function(因为我的程序不使用 RTTI 和 EXCEPTIONS 运行时C++),并且它有一个简单的函数实现来解决这个问题?
我不能使用 STL std::函数(因为我的程序不使用 RTTI 和 EXCEPTIONS 运行时C++)
然后你可能需要编写自己的等价物std::function
.
通常的std::function
类型擦除实现不需要RTTI来实现其大部分功能;它通过常规的虚函数调用工作。因此,编写自己的版本是可行的。
事实上,std::function
中唯一需要RTTI的是target_type
和target
函数,这不是世界上最有用的函数。假设您使用的实现不需要 RTTI 进行日常业务,则可能只使用 std::function
而不调用这些函数。
通常,当您禁用异常处理时,程序只是在遇到 throw
语句时关闭并出错。而且由于std::function
会发出的大多数异常都不是您能够从中恢复的那种东西(调用空function
、内存不足等),因此您可能可以按原样使用std::function
。
只有没有捕获的 lambda 才能转换为函数指针。这是 lambda 的扩展,仅适用于此特定情况 [*]。通常,lambda 是函数对象,您无法将函数对象转换为函数。
具有状态(捕获)的 lambda 的替代方法是使用 std::function
而不是普通函数指针。
[*]:如果保存状态的 lambda 可以转换为函数指针,那么状态将在哪里维护?(请注意,此特定 lambda 可能有多个实例,每个实例都有自己的状态,需要单独维护)
如前所述,只有捕获任何内容的 lambda 才能转换为函数指针。
如果你不想使用或编写类似 std::function 的东西,那么另一种选择是将你本来会捕获的东西作为参数传递。您甚至可以创建一个结构来保存它们。
#include <iostream>
struct captures { int x; };
int (*func)(captures *c) = [](captures *c){ return c->x; };
int main() {
captures c = {10};
std::cout << func(&c) << 'n';
}
另一种选择是使用不需要捕获的全局/静态/thread_local/constexpr 变量。
使用std::function
,它不需要任何"运行时"。否则,请在此处查找如何自己实现std::function
的草图。
- QMetaObject invokeMethod的基于函数指针的语法
- C++-试图将函数指针推回到另一个CPP文件中的矢量时出错
- c++r值引用应用于函数指针
- 模板函数指针和lambda
- 是否可以将llvm::FunctionType转换为C/C++原始函数指针
- 带有类的函数指针
- () 函子后面的括号,而不是函数指针?
- 全局作用域中函数指针的赋值
- 使用"Task"函数指针队列定义作业管理器
- 将成员函数指针作为参数传递给模板方法
- 如何创建对象函数指针C++映射?
- 匹配函数指针作为模板参数?
- 通过函数指针定义类范围之外的方法
- 存储在类中的函数指针
- C++从函数指针数组调用函数
- 将返回值存储在函数指针数组的指针中是如何工作的?
- 整数键映射到头文件中的成员函数指针
- 从类成员函数到类 C 函数指针的转换
- 如何将内联匿名函数分配给C++函数指针
- 将字符缓冲区强制转换为函数指针