C++11 小技巧之函数指针

C++11拥有了一次性函数lambda,所以在面对回调函数的时候,直接给一个lambda可以降低整体类设计的复杂度。

但是如果回调接口是C语言,那么只有一种lambda可以作为回调,就是不带捕获的lambda。

如下:

void mainCB(void(*)(int)){};

{
    main([](int){})();
}
如果带任何捕获,那么编译器做类型推导时会带着“lambda”标签,表明这是lambda函数,导致推导出的类型和回调类型不同。

而如果不带捕获,编译器会简单的把lambda表达式推导为普通函数,所以可以直接作为函数指针使用。

但是如果把lambda表达式传入std::function对象,那么不论有没有捕获,通过function->target返回的都是空,在底层代码可以看到,target传入的模板参数的typeid和function内保存的函数指针的typeid不同。

猜你喜欢

转载自blog.csdn.net/blwinner/article/details/53785074