模板函数如何处理可能共享一个交集的多个类型名称?
How does template function work with multiple typenames which may share an intersection?
我是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; }
相关文章:
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 检查一个类型是否直接派生自"enable if"上下文中的另一个类型(是其子类型)
- 给定一个类型,如何派生一个泛型更广泛的类型(例如,用于溢出安全求和)?
- 更改可变参数模板中的最后一个类型
- 如何构造一个类型特征,可以判断一个类型的私有方法是否可以在另一个类型的构造函数中调用?
- 有没有办法同时将一个类型分配给C++中的多个模板?
- C++:可以模板化一个类型名称吗
- 有没有一种方法可以使用SFINAE来检测一个类型是否实现了给定的抽象基类
- 给定一个类型为 Container:<T>:Iterator 的函数参数,如何为某些类型的 T 实现特定的重载?
- 期望一个类型,得到一个模板
- 初始化一个类型向量的巨大向量<int>
- 我可以使用预处理器将一个类型声明替换为另一个类型声明吗?
- 具有多种类型的类数组?如何访问数组中的一个类型
- Opencv C++ 声明一个类型为 uint8 的矩阵
- 模板参数列表中只有一个类型名称是什么意思?
- C++模板部分特化:为什么我无法匹配可变参数模板中的最后一个类型
- 为什么我们有一个类型不匹配
- 在函数模板中将一个类型名映射到另一个类型名
- 创建一个类型bool的向量,其中所有值均可初始化为true
- 在C API中定义了一个类型,如何将其与命名空间中的C++类相关联