Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 模板参数作为返回类型_C++_Templates_Return Type - Fatal编程技术网

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
    方法会遇到更多困难。