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

标签 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;
}

这是我得到的:

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

最佳答案

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

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

关于带有函数指针的 C++ 模板回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28784511/

相关文章:

c++ - 如何使 FFTW 希尔伯特变换计算得更快?

c++ - 类指针成员和异常处理

c++ - 调用 malloc 后我得到了一个意想不到的大小

C++ 将内存页面大小从 4096 字节减少

c++ - 为什么 C++ "known"用于制作大量拷贝?

c++ - 快速平面旋转算法?

c++ - QT - 逐步将小部件添加到水平布局

c++ - 编译代码太快会出错

c++ - 用于分布式计算的 C/C++ 框架(MPI?)

c++ - SFML & OpenGL(glew) 为什么我的程序在绘制到新窗口时失败?