C++中如何将模板函数作为另一个模板函数的参数调用?
解决C++模板函数作为参数传递时的推导失败问题
编译器报错的核心原因是模板函数名本身不是一个具体的函数类型,而是一组函数模板的集合。当你直接传递take_data给is_part_of_triangle时,编译器无法自动推导出inpOutp的类型——因为take_data还没有被实例化为某个具体的函数。
以下是三种可行的解决方案:
方案一:显式实例化模板函数
直接在调用时指定take_data的模板参数,让它变成一个具体的函数实例,编译器就能顺利推导类型:
修改main函数:
int main(void){ // 显式指定take_data的模板参数为result的类型 return is_part_of_triangle(take_data<decltype(result)>, result); }
这里decltype(result)会获取到result函数的类型int(int, int, int),take_data<decltype(result)>就成为了明确的bool(int(*)(int, int, int))类型函数,编译器可直接推导inpOutp参数。
方案二:将模板函数改为函数对象(Functor)
把take_data从模板函数改成重载operator()的结构体,使其成为具体类型,编译器可直接推导:
// 替换原有的template <class dec> bool take_data(dec ft_result) struct TakeData { template <class dec> bool operator()(dec ft_result) { // 原take_data的业务逻辑示例 int cathetus_size = 5, x_X = 3, y_X = 4; ft_result(cathetus_size, x_X, y_X); return true; // 根据实际逻辑返回对应值 } };
调用时传递TakeData的实例:
int main(void){ return is_part_of_triangle(TakeData{}, result); }
这种方式的优势是函数对象可以携带状态,传递时无需显式指定模板参数,灵活性更高。
方案三:用Lambda临时包装模板函数
无需修改原有take_data函数,用lambda表达式将其包装为具体可调用对象,编译器会自动推导lambda的类型:
int main(void){ return is_part_of_triangle( [](auto ft_result) { return take_data(ft_result); }, result ); }
lambda的auto参数会自动匹配result的类型,内部调用take_data时会自动实例化对应模板版本,这种方式最简洁,无需改动原有函数结构。
内容的提问来源于stack exchange,提问作者msaLina
相关产品推荐
相关产品推荐

