You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将C++函数模板作为参数传递给另一个函数?

函数模板作为参数传递的可行方案

函数模板本身无法直接作为参数传递——它并非具体的可调用实体,只是用于生成具体函数的"蓝图"。但有几种间接方式可以实现类似需求,结合你的代码示例说明如下:

方法1:传递模板的具体实例化版本

直接指定模板参数,传递已经实例化的具体函数。这种方式简单直接,但灵活性有限,仅适用于固定类型场景。

修改后的代码:

template<typename T>
void execute_example(T* begin, T* end) 
{
    T val = static_cast<T>(10 * 0.8);
    while (begin != end) 
    {
        *begin = val;
        val *= static_cast<T>(0.8);
        ++begin;
    }
}

using var_t = std::variant<float*, int*, double*>;

template<class UnaryOperator>
void my_function(UnaryOperator unary_op, var_t input, size_t size) 
{
    if (input.index() != 0)
        return;
    float* begin = std::get<0>(input);
    float* end = begin + size;
    unary_op(begin, end); // 无需再显式指定模板参数
}

int main() 
{
    float* vals = new float[10]; // 修正原代码的语法错误
    my_function(execute_example<float>, vals, 10); // 传入实例化后的具体函数
    delete[] vals;
}

方法2:用泛型Lambda包裹函数模板

泛型Lambda可以在内部根据上下文自动推导并实例化函数模板,既保留了模板的通用性,又能作为可调用对象传递。这是你提到的可行方案,也是推荐的通用做法。

修改后的代码:

template<typename T>
void execute_example(T* begin, T* end) 
{
    T val = static_cast<T>(10 * 0.8);
    while (begin != end) 
    {
        *begin = val;
        val *= static_cast<T>(0.8);
        ++begin;
    }
}

using var_t = std::variant<float*, int*, double*>;

template<class UnaryOperator>
void my_function(UnaryOperator unary_op, var_t input, size_t size) 
{
    if (input.index() != 0)
        return;
    float* begin = std::get<0>(input);
    float* end = begin + size;
    unary_op(begin, end);
}

int main() 
{
    float* vals = new float[10];
    // 用泛型Lambda包裹函数模板
    my_function([](auto* begin, auto* end) {
        execute_example(begin, end);
    }, vals, 10);
    delete[] vals;
}

方法3:使用模板模板参数

如果my_function的设计可以适配,可通过模板模板参数直接接受函数模板。这种方式对函数模板的参数格式有严格要求,仅适用于特定场景。

修改后的代码:

template<typename T>
void execute_example(T* begin, T* end) 
{
    T val = static_cast<T>(10 * 0.8);
    while (begin != end) 
    {
        *begin = val;
        val *= static_cast<T>(0.8);
        ++begin;
    }
}

using var_t = std::variant<float*, int*, double*>;

// 用模板模板参数接受函数模板
template<template<typename> class UnaryOperator>
void my_function(var_t input, size_t size) 
{
    if (input.index() != 0)
        return;
    float* begin = std::get<0>(input);
    float* end = begin + size;
    UnaryOperator<float>(begin, end);
}

int main() 
{
    float* vals = new float[10];
    // 调用时显式指定函数模板
    my_function<execute_example>(vals, 10);
    delete[] vals;
}

内容的提问来源于stack exchange,提问作者Sam Moldenha

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 21:27:39