模板函数如何处理可能共享一个交集的多个类型名? 我是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; } 模板 T add(ta,tb){返回a+b;} int main(){ 浮点数a_f=2.5;浮点数b_f=1.5;浮点数c_f; int a_i=2;int b_i=1;int c_i; c_f=加(a_f,b_f); c_i=加(a_i,b_i); 返回0; }

模板函数如何处理可能共享一个交集的多个类型名? 我是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; } 模板 T add(ta,tb){返回a+b;} int main(){ 浮点数a_f=2.5;浮点数b_f=1.5;浮点数c_f; int a_i=2;int b_i=1;int c_i; c_f=加(a_f,b_f); c_i=加(a_i,b_i); 返回0; },c++,templates,generic-programming,C++,Templates,Generic Programming,接下来,我想添加两个不同类型和相等类型的数字。我天真的假设是: 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&

接下来,我想添加两个不同类型和相等类型的数字。我天真的假设是:

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;
}
模板
R加(sa,tb){返回a+b;}
int main(){
浮点数a=3.2;整数b=2;
auto result1=add(a,b);//错误:调用“add(float&,int&)”时没有匹配的函数
auto result2=add(a,a);//错误:调用“add(float&,float&)”时没有匹配的函数
auto result3=add(b,b);//错误:调用“add(int&,int&)”没有匹配的函数
返回0;
}
我知道这种方法是不正确的,因为typename的共享数据类型的交集,因此声明本身不能正确


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

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

template<typename R, typename S, typename T>
R 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;
}

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

尽管类型化不是正确的工具,但C++提供了其他推断类型的手段。

使用自动 您只需将
auto
放在那里,让编译器从返回类型推断:

template<typename S, typename T>
auto add(S a, T b){ return a + b; }
模板
自动添加(sa,tb){返回a+b;}
使用尾随返回类型 如果希望更明确地说明函数的返回类型,也可以使用尾部返回类型:

template<typename S, typename T>
auto add(S a, T b) -> decltype(a + b) { return a + b; }
模板
自动添加(sa,tb)->decltype(a+b){返回a+b;}

Aha这很有道理,解决了我的问题。你能解释一下为什么用“class”而不是“typename”吗?@One3Three7
class
比type短,而且
class
typename
在上下文中没有区别。你可以在
{
对于C++11兼容性…或
->std::common_type::type
@one3三个我更喜欢
typename
并且希望其他人这样写,因为它更好地表达了一个人的意图。可读性很重要。
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; }