C++ 模板参数作为返回类型
不久前我偶然发现了这一点,我最终需要得到一个答案 问题如下:C++ 模板参数作为返回类型,c++,templates,return-type,C++,Templates,Return Type,不久前我偶然发现了这一点,我最终需要得到一个答案 问题如下: #include <iostream> using namespace std; template <class FIRST, class SECOND> FIRST multiply(FIRST a, SECOND b){ return a * b; } int main(){ int x = 39; double y = 38.38; cout << mu
#include <iostream>
using namespace std;
template <class FIRST, class SECOND>
FIRST multiply(FIRST a, SECOND b){
return a * b;
}
int main(){
int x = 39;
double y = 38.38;
cout << multiply(x, y) << endl;
}
#包括
使用名称空间std;
模板
第一次乘法(第一次a,第二次b){
返回a*b;
}
int main(){
int x=39;
双y=38.38;
cout处理这种情况的规范方法是返回从调用的操作结果返回的适当类型:
template <typename FIRST, typename SECOND>
auto multiply(FIRST a, SECOND b) -> decltype(a * b) {
return a * b;
}
模板
自动乘法(第一个a,第二个b)->decltype(a*b){
返回a*b;
}
此用例几乎是添加延迟返回类型的激励示例:操作的结果类型可能完全不可预测。这导致了两个需求:
需要能够确定表达式的类型,这就是decltype(expr)
所做的:它产生声明为expr
的类型:当expr
是函数调用时,您可以查看函数声明,这就是decltype(expr)
所产生的(嗯,这里面有一些复杂性)
为了实际表达expr
,经常需要掌握函数参数。因此,引入了一种新的函数声明方法:
auto
函数名(
args)->
返回类型
auto
关键字仅表示函数将使用延迟返回类型。函数名和参数的使用方式与其他functino声明中的相同。然后,返回类型跟随在可以使用参数名的位置,即->
之后是返回->类型,通常位于函数前面离子声明
换言之,如果返回类型未引用参数名称,则上述声明等效于此声明:
返回类型函数名(
args)
如果返回类型引用了args中引入的名称,则需要处理获取适当类型的对象的问题,例如,使用std::declval()
你可以用
typename std::common_type<FIRST,SECOND>::type
typename std::common\u type::type
作为算术表达式的返回类型。您可能需要更正术语。您有一个函数模板和两个模板参数。谢谢,因为我不能说是,为什么您希望返回类型像a
,在您的示例中是int
?int
*double
为您提供e> 加倍
,基本上,当从操作结果返回int
时,您会损失一部分。注意,在C++14中,您不需要decltype
,模板可以推断出一个自动
返回类型。好吧,谢谢,但我不知道aut和decltype做什么,因为我只处于半年的自学阶段C++。我可以猜测它做什么和为什么,但是你介意详细解释一下吗?我还不知道那个站点,所以非常感谢!我想这将从现在起为我省去一些麻烦。^需要前面的代码>类型名称< /Cord>。@ Angew:严格地说,<代码>类型名称< /C> >是告诉编译器它是一个类型。我在和一个人说话……做了一个编辑。注意,这不起作用,例如,当第一个和第二个是非方矩阵时:将矩阵
和矩阵
相乘将产生矩阵
@Dietmar Kühl:不,不起作用。但是,为了补偿,它也适用于变量标量运算,模板ate自动乘法(Args…Args)->typename std::common_type::type
,其中使用decltype
方法会遇到更多困难。