模板函数如何处理可能共享一个交集的多个类型名称?

How does template function work with multiple typenames which may share an intersection?

本文关键字:一个 类型 共享 何处理 函数 处理      更新时间:2023-10-16

我是C++新手,目前正在尝试了解模板函数的工作原理。首先,我想添加两个相同类型的数值,这很容易理解。

template <typename T>
T add(T a, T b){return a+b;}
int main(){
float a_f=2.5;float b_f=1.5;float c_f;
int a_i=2;int b_i=1;int c_i;
c_f = add(a_f, b_f);
c_i = add(a_i, b_i);
return 0;
}

接下来,我想添加两个类型不同且相等的数字。我幼稚的假设是这样的:

template<typename R, typename S, typename T>
R add(S a, T b){return a+b;}
int main(){
float a=3.2; int b=2;
auto result1 = add(a,b);    // error: no matching function for call to ‘add(float&, int&)’
auto result2 = add(a,a);    // error: no matching function for call to ‘add(float&, float&)’
auto result3 = add(b,b);    // error: no matching function for call to ‘add(int&, int&)’
return 0;
}

我知道这种方法是不正确的,因为类型名共享有关数据类型的交集,因此声明本身不可能是正确的。

如何实现一个简单的 add(( 函数,将两个数值相加,无论类型如何?

问题不在于交叉点,而在于它无法推断出R。 在

template<typename R, typename S, typename T>
R add(S a, T b){return a+b;}

没有任何内容告诉编译器R应该是什么。 它不是从您为其分配结果的变量中推导出来的,并且您没有指定它,因此没有它可以执行的有效调用。 要解决此问题,您可以摆脱R并使用auto返回类型为您推断它,例如

template<typename S, typename T>
auto add(S a, T b){return a+b;}

如何实现一个简单的add()函数,将两个数值相加,而不管类型如何?

在C++14:

template<class T, class U>
auto add(T t, U u) {
return t + u;
}

在上面,返回值的类型是从表达式的类型推导出来的t + u

C++11 不推导返回类型,但允许尾随返回类型,因此 C++11 版本为:

template<class T, class U>
auto add(T t, U u) -> decltype(t + u) {
return t + u;
}

你想要的是推断返回类型。但是,类型模板参数的类型推断仅适用于函数参数。

尽管类型名不是执行此操作的正确工具,但C++提供了推断类型的其他方法。

使用自动

你可以简单地把auto放在那里,让编译器从返回类型中推断:

template<typename S, typename T>
auto add(S a, T b){ return a + b; }

使用尾随返回类型

如果要更明确地说明函数的返回类型,也可以使用尾随返回类型:

template<typename S, typename T>
auto add(S a, T b) -> decltype(a + b) { return a + b; }
相关文章: