带有函数指针的c ++模板回调

7 c++

我想知道是否有可能实现这样的事情,而不会抛出错误:

#include <iostream>

template<typename T>
T Sum(T _arg, T (*callbackFunction)(T))
{
    T result = (*callbackFunction)(_arg);
    return result;
}

template<typename T>
T Callback(T _arg)
{
    std::cout << "Callback is called" << std::endl;
    return _arg;
}

int main()
{
    std::cout << Sum(10.2f, Callback);

    getchar();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这就是我得到的:

cannot use function template 'T Callback(T)' as a function argument
could not deduce template argument for 'T' from 'float'
Run Code Online (Sandbox Code Playgroud)

pep*_*ico 6

你不能将函数模板作为参数传递,你必须传递一个实例化,这是一个例子:

Live On Coliru

#include <iostream>

template<typename T, typename F>
T Sum(T arg, F f)
{
    return f(arg);
}

template<typename T>
T Callback(T arg)
{
    std::cout << "Callback is called" << std::endl;
    return arg;
}

auto Callback2 = [](auto arg)
{
    std::cout << "Callback2, a generic lambda, is called" << std::endl;
    return arg;
};

int main()
{
    std::cout << Sum(10.2f, Callback<float>) << std::endl;
    std::cout << Sum(10.2f, Callback2) << std::endl;
    std::cout << Sum(10.2f, [](auto arg) {
        std::cout << "An in-place generic lambda is called" << std::endl;
        return arg;
    }) << std::endl;

    getchar();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)


die*_*ini 3

#include <functional>
#include <iostream>

template<typename T>
T Sum(T _arg, std::function<T(T)> callbackFunction) // Note the std::function replacement and how callbackFunction is called below
{
    T result = callbackFunction(_arg);
    return result;
}

template<typename T>
T Callback(T _arg)
{
    std::cout << "Callback is called" << std::endl;
    return _arg;
}

int main()
{
    std::cout << Sum(10.2f, Callback);

    getchar();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这应该有效。此代码是标准 C++11,您应该在编译命令中启用它。

  • 不要使用 `std::function&lt;/* 与模板参数相关的类型 */&gt;` 作为函数模板的参数。将参数 `callbackFunction` 泛化为任何类型,例如 `T Sum(T _arg, U callbackFunction)`,[出于此处描述的原因](http://stackoverflow.com/questions/11628765/why-do-lambda-functions-在-c11-not-have-function-types/11629125#11629125)。现在你的代码甚至无法编译。 (2认同)