Visual Studio 2012中的std :: function目标方法

Cru*_*row 0 c++ lambda c++11 visual-studio-2012

我有以下代码:

#include <functional>

//...

typedef int (*Myfun)(int);
std::function<int (int)> fn0([](int a)->int {
    return -a;
});
std::cout << "val == " << fn0(3) << std::endl; //"val == -3"
Myfun *fptr = fn0.target<Myfun>(); //fptr is NULL!!
std::cout << "val == " << (*fptr)(3) << std::endl; //Access violation error
Run Code Online (Sandbox Code Playgroud)

实际上,这段代码是来自MSDN的代码,稍有改动:使用lambda而不是普通函数.

为什么调用fn0.target<Myfun>()返回NULL?

当我宣布一个常规功能

int neg(int val) { 
    return (-val); 
}
Run Code Online (Sandbox Code Playgroud)

并写std::function<int (int)> fn0(neg);,一切似乎都有效,但lambda没有得到正确处理.

Cub*_*bbi 5

类型Myfunfrom typedef int (*Myfun)(int);与函数的目标类型无关,它是通过执行表达式生成的闭包对象的唯一,未命名类型[](int a)->int { return -a; }

尝试执行std::cout << fn0.target_type().name() << '\n';以查看自己.

当你用一个函数声明一个函数时int neg(int val) { return (-val); },它的类型neg就是Myfun(在函数到指针转换之后发生std::function<int(int)> fn0(neg)),这就是为什么std::function::target()能够返回指向它的指针.

  • @Cruel_Crow没有存储来保存C函数中的捕获参数,你需要一些包装器.有大量的Q&作为上,例如http://stackoverflow.com/questions/18169180/whats-the-best-way-to-wrap-ac-callback-with-a-c11-interface (2认同)