我开始使用 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
如果使用auto,它工作正常:
const char * text = "Test!";
auto test = [&]()
{
puts(text);
};
test();
我的问题是:如何使用 [&] 为 lambda 创建类型?在我的例子中,我不能使用 STL std::function(因为我的程序没有使用 C++ RTTI 和 EXCEPTIONS 运行时),它有一个简单的函数实现来解决这个问题?
最佳答案
I can not use the STL std::function (because my program does not use C++ RTTI and EXCEPTIONS runtime)
那么您可能需要编写自己的 std::function
等价物。
std::function
的类型删除的通常实现不需要 RTTI 来实现其大部分功能;它通过常规的虚函数调用工作。所以编写您自己的版本是可行的。
事实上,std::function
中唯一需要 RTTI 的是target_type
和target
函数,这不是世界上最有用的功能。您可以只使用 std::function
而无需调用这些函数,假设您正在使用的实现不需要 RTTI 用于其日常业务。
通常,当您禁用异常处理时,程序会简单地关闭并在遇到 throw
语句时出错。而且由于 std::function
发出的大多数异常都不是您可以从中恢复的那种东西(调用空的 function
,用完内存等),您可以按原样使用 std::function
。
关于C++11 lambdas 到函数指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10997237/