如何将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
相关产品推荐
相关产品推荐

