c++ - 模板中定义类型未知的函数

浏览:51日期:2023-03-31

问题描述

请问如何在一个模板中定义类型未知的函数呢?我需要将一段程序的多个步骤和其中的某个操作分离,比如说:

#include <iostream>template <typename T>T adder(T a, T b){ return a + b;}template <T F(T, T)> //--- HereT executor(T a, T b){ return F(a, b);}int main(){ std::cout << executor<adder>(1, 2); std::cout << executor<adder>(3.0f, 4.0f); return 0;}

但是上面template <T F(T, T)>中的T是不能被编译器识别的,怎样解决这个问题呢?

我自己找到答案了,这个贴就让沉掉吧(不知道怎么关闭╮(╯▽╰)╭):

#include <iostream>template <typename T>T adder(T a, T b){ return a + b;}template <typename T, T F(T, T)>T executor(T a, T b){ return F(a, b);}int main(){ std::cout << executor<int, adder>(1, 2); std::cout << executor<float, adder>(3.0f, 4.0f); return 0;}

问题解答

回答1:

在这里首先要确定好adder的类型,才能推到出executor的类型。而源程序中adder的类型是由executor的函数参数确定的,推导先后次序出了问题,所以可以通过手动给出adder类型的方法解决。当然也许有更好的方法?

#include <iostream>template <typename T>T adder(T a, T b){ return a + b;}template <typename T, T F(T, T)>T executor(T a, T b){ return F(a, b);}int main(){ std::cout << executor<int, adder>(1, 2); std::cout << executor<float, adder>(3.0f, 4.0f); return 0;}

相关文章: