请考虑以下代码:
#include <functional>
#include <iostream>
void normalFunction()
{
printf("bar");
}
int main()
{
std::function<void ()> f1 = []()
{
printf("foo123");
};
std::function<void()> f2 = normalFunction;
std::cout << f1.target<void (*)()>() << std::endl;
std::cout << f2.target<void (*)()>() << std::endl;
return 0;
}
第二行打印有效地址;但是,第一次调用target
失败(返回nullptr
),因为存储的可调用类型不是void ()
,它实际上是class <lambda_b356045a9ea53f6e7d502dd6abd8cae2>
(正如target_type
告诉我们的那样)。
这意味着std::function<T>::target
在检查类型时非常正统,并且需要完全匹配 - 即使lambda可以毫无问题地转换为void (*)()
,因为它是无捕获的。
有没有办法克服这种行为?我希望能够将回调传递给与C代码接口的函数,因此需要进一步传递函数指针。一种选择是让函数获取函数指针,因为没有捕获的lambda可以隐式转换;但出于好奇,我想知道是否有办法使用std::function
来做到这一点。