gpt4 book ai didi

C++11 lambdas 到函数指针

转载 作者:可可西里 更新时间:2023-11-01 15:37:22 26 4
gpt4 key购买 nike

我开始使用 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com