首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >函数指针的C++11 lambdas

函数指针的C++11 lambdas
EN

Stack Overflow用户
提问于 2012-06-12 13:01:40
回答 4查看 14.1K关注 0票数 10

我开始使用C++11 lambda开发应用程序,并需要将某些类型转换为函数指针。这在GCC 4.6.0中很好地发挥了作用:

代码语言:javascript
复制
void (* test)() = []()
{
    puts("Test!");
};

test();

我的问题是,当我需要在lambda中使用函数或方法局部变量时:

代码语言:javascript
复制
const char * text = "test!";

void (* test)() = [&]()
{
    puts(text);
};

test();

G++ 4.6.0给出了强制转换错误代码:

代码语言:javascript
复制
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,则工作正常:

代码语言:javascript
复制
const char * text = "Test!";

auto test = [&]()
{
    puts(text);
};

test();

我的问题是:如何使用&为lambda创建类型?在我的例子中,我不能使用STL std::函数(因为我的程序不使用C++ RTTI和异常运行时),它有一个简单的函数实现来解决这个问题?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-06-12 14:14:38

I不能使用STL::function(因为我的程序不使用C++ RTTI和异常运行时)

然后,您可能需要编写您自己的等价于std::function

用于std::function的类型擦除的通常实现对于其大部分功能不需要RTTI;它通过常规的虚拟函数调用工作。所以写你自己的版本是可行的。

事实上,std::function中唯一需要RTTI的是target_typetarget函数,它们不是世界上最有用的函数。您可以只使用std::function而不调用这些函数,假设您所使用的实现不需要RTTI用于其通常的业务。

通常,当您禁用异常处理时,当遇到throw语句时,程序只会关闭并出错。而且,由于std::function发出的大多数异常都不是您能够从其中恢复的(调用空的function、内存不足等),所以您可能只需按原样使用std::function

票数 10
EN

Stack Overflow用户

发布于 2012-06-12 14:00:29

只有没有捕获的lambda才能转换为函数指针。这是lambdas的扩展,只适用于这个特定的情况*。通常,lambda是函数对象,不能将函数对象转换为函数。

具有状态(捕获)的lambda的替代方法是使用std::function而不是普通的函数指针。

*:如果持有状态的lambda可以转换为函数指针,状态将在哪里维护?(请注意,这个特定lambda可能有多个实例,每个实例都有自己的状态,需要单独维护)

票数 9
EN

Stack Overflow用户

发布于 2012-06-12 18:06:12

如前所述,只有不捕获任何内容的lambdas才能转换为函数指针。

如果您不想使用或编写类似于std::function的内容,那么另一种选择是将本来要捕获的内容作为参数传递。您甚至可以创建一个结构来保存它们。

代码语言:javascript
复制
#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';
}

另一种选择是使用不需要捕获的全局/静态/线程_local/ Another变量。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10997237

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档