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

c++ template callbacks with function pointer

本文关键字:回调 c++ 函数 指针      更新时间:2023-10-16

我想知道是否有可能在不引发错误的情况下实现这样的目标:

#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;
}

这就是我得到的:

cannot use function template 'T Callback(T)' as a function argument
could not deduce template argument for 'T' from 'float'

不能将函数模板作为参数传递,必须传递实例化,例如:

在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;
}
#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;
}

这应该行得通。这段代码是标准的C++11,您应该在编译命令中启用它。