返回类型为模板化类型的c ++模板

时间:2013-12-13 15:11:08

标签: c++ templates

我想写一个这样的函数:

  template<class T1, T2>
  T2 getvalue(T1 in)
  {
     T2 tmp;

     // do some work here
     return T2;
  }

以这种方式打电话:

  float x[100];
  int x=getvalue<int>(x);

但似乎我不能这样做。想法是编译器从使用中检测T1,但我定义了返回类型。但上面的代码会产生错误。

关于我如何做到这一点的任何建议?

3 个答案:

答案 0 :(得分:5)

当您明确指定函数模板参数时,它们将从 left 填充;推断出所有剩余的论点。所以你必须这样写:

template <typename T, typename U>
T getvalue(U in)
{
    return in;
}

用法:

auto x = getvalue<int>(1.5);     // x is an "int", and U is deduced as "double"

答案 1 :(得分:2)

首先,你有一个错字。在return语句中,您尝试返回的是类型,而不是名称。变化:

 return T2;

为:

 return tmp;

其次,模板参数列表中还有一个语法错误。您需要在{em>每个模板参数名称前面加上classtypename(我更喜欢typename,但这就是我):

  template<typename T1, typename T2>

最后,您可以通过将返回类型作为第一个模板参数来获得演绎效果:

  template<typename T1, typename T2>
  T1 getvalue(T2 in)
  {
     T1 tmp;

     // do some work here
     return tmp;
  }

Decuction现在可以按预期工作:

bool b = getValue <bool> (42.0);

原因是模板参数从 left right 进行评估,而不是按任意顺序。一旦应用了最左边的模板参数,编译器将尝试推导出未指定的任何模板参数。

答案 2 :(得分:0)

好问题,模板在C ++中会变得棘手。

正确编写的版本:

template<typename T1, typename T2>
T2 getvalue(T1 in)
{
   T2 tmp;
   // do some work here with tmp
   return tmp;
}

根据你的例子调用正确的方法:

  float x[100]; //array of 100 floats. depending on your application, best practice would suggest to initial the values in the array to 0.
  int x=getvalue<double, int>(3.5); //note int x is different than float x[]. 

您的函数当前正在返回int。如果要返回浮点数的数组,模板参数也应该反映出来。 最好始终指定两个模板参数。记住功能模板不能像类模板那样部分专业化(仅完全)

只是我的0.02美元