按参数类型更改“返回类型模板”

时间:2017-05-21 00:20:15

标签: c++ c++11 templates return-type typename

我正在学习模板功能和搜索,试图让它工作几个小时,但我找不到。

#include <iostream>
using namespace std;

template<typename A, typename B, typename C>
C add (A a, B b){
  return a + b;
}

int main() {
    int x = 1;
    float y = 2.5;
    float z = add(x,y);
    cout << "z is: " << z ;

return 0;
}

我发现的另一个解决方案是

template <type name A, typename B>
auto add(A a, B b){
     return a + b;
}

int main() {
    int x = 1;
    float y = 2.5;
    cout << add(x,y);
}

第二个代码工作正常,返回类型会自动更改我设置的任何参数类型。但是,当我为返回类型添加一个<typename C>的add函数时,它会显示错误消息。如何在主函数中运行它?

1 个答案:

答案 0 :(得分:0)

您可以使用通过std::declval()decltype()定义的默认返回模板参数。

以下是一个例子

#include <iostream>
#include <functional>

template <typename A, typename B,
          typename C = decltype(std::declval<A>() + std::declval<B>())>
C add (A a, B b)
 { return a + b; }

int main()
 {
   int x = 1;
   float y = 2.5;
   float z = add(x,y);

   std::cout << "z is: " << z << std::endl;
 }

auto返回类型(没有-> decltype())从C ++ 14开始有效时,这也适用于C ++ 11。