我开始使用 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
If use auto,它工作正常:
const char * text = "Test!";
auto test = [&]()
{
puts(text);
};
test();
我的问题是:如何为 lambda 创建类型[&]?就我而言,我无法使用STL标准::函数(因为我的程序不使用C++ RTTI和EXCEPTIONS运行时),并且它有一个简单的函数实现来解决这个问题?
我无法使用 STL std::function (因为我的程序不使用 C++ RTTI 和 EXCEPTIONS 运行时)
然后你可能需要编写你自己的等价物std::function
.
类型擦除的通常实现std::function
大部分功能不需要 RTTI;它通过常规的虚函数调用来工作。因此编写自己的版本是可行的。
事实上,唯一的事情是std::function
that needRTTI 是target_type
and target
函数,这不是世界上最有用的函数。你也许可以使用std::function
假设您正在使用的实现不需要 RTTI 来完成其日常业务,则无需调用这些函数。
通常,当您禁用异常处理时,程序会在遇到异常时简单地关闭并出错。throw
陈述。而且由于大多数例外情况std::function
会发出的不是那种你能够从中恢复的东西(调用一个空的function
,内存不足等),你可能可以使用std::function
as is.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)