【问题标题】:changeble "return type template" by parameter type按参数类型更改“返回类型模板”
【发布时间】:2017-05-21 00:20:14
【问题描述】:

我正在研究模板函数和搜索,试图让它工作几个小时但我找不到。

#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);
}

第二个代码工作正常,无论我设置什么参数类型,返回类型都会自动更改。但是,当我为返回类型的 add 函数再添加一个 &lt;typename C&gt; 时,它会显示错误消息。如何让它在主函数中运行?

【问题讨论】:

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


【解决方案1】:

您可以使用通过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 返回类型(没有-&gt; decltype())从 C++14 开始有效时,这也适用于 C++11。

【讨论】:

  • 你也可以使用 C++11 尾随返回类型,应该比那些delcval()s 短得多。
  • @HolyBlackCat - 你的意思是auto add (A a, B b) -&gt; delctype(a+b)?这也适用于 C++11,但 OP 要求为返回类型添加模板 typename C
猜你喜欢
  • 2022-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多