C++11 lambdas 到函数指针

标签 c++ c++11

我开始使用 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_typetarget 函数,这不是世界上最有用的功能。您可以只使用 std::function 而无需调用这些函数,假设您正在使用的实现不需要 RTTI 用于其日常业务。

通常,当您禁用异常处理时,程序会简单地关闭并在遇到 throw 语句时出错。而且由于 std::function 发出的大多数异常都不是您可以从中恢复的那种东西(调用空的 function,用完内存等),您可以按原样使用 std::function

关于C++11 lambdas 到函数指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10997237/

相关文章:

c++ - 操纵谷歌地球 : smooth navigation

c++ - 模板作为函数模板的参数 - 推导失败

c++ - 使用 decltype(this) 获取函数引用

c++ - 如何在抛出异常时阻止构造函数创建对象

c++ - 递归 boost::variant 类型不能用 "-std=c++11 -stdlib=libc++"编译

c++11 - boost::odeint my_vector.cpp 示例中的段错误

c++ - IVdsPack::创建卷

c++ - 将函数指针传递给函数

c++ - clang : error: cannot specify both '-fobjc-arc' and '-fobjc-gc' in Xcode 4. 6.3

c++ - 这是有效的 C++ 代码吗?