当T是无捕获的lambda

时间:2016-08-16 07:43:57

标签: c++ c++11 lambda callback function-pointers

请考虑以下代码:

#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来做到这一点。

0 个答案:

没有答案