以下C ++模板程序中的无效语句是什么?

时间:2016-01-25 12:10:06

标签: c++ templates c++11

当我使用这样的模板时,是否可以将多个不同数据类型的参数传递给同一个函数?

template <typename T> T func(T a, T str)
{
  T strx = str + 'x';
  return strx;
}

int main()
{
  int a = 10;
  int x;
  string str = "hai";
  str = func(a, str);
  cout << x;
  return 0;
}

2 个答案:

答案 0 :(得分:2)

不使用单个模板参数。例如,您将intstring作为参数传递给func。在这种情况下,T会是什么类型?您需要使用2个单独的模板类型来定义每个模板类型,例如:

template <typename T1, typename T2>
T2 func(T1 a, T2 str)

现在看来,您真正想要做的就是将值附加到string。您可以使用istringstream来完成此操作,但您只需要一个模板参数:

template<typename T>
string func(T a, string& str) {
    return static_cast<ostringstream&>(ostringstream(str, ios_base::ate) << a).str();
}

或者,如果你知道你要追加的类型总是数字类型,你可以使用:to_string来完成同样的事情。

如果您想添加两个不相关的类型,您可以这样做:

template <typename T1, typename T2>
T2 func(T1 a, T2 str) {
    stringstream sstream;

    sstream << a;

    T2 t2a;

    sstream >> t2a;

    return str + t2a;
}

这个obviously work用于func(string{"42"}, 13)等值,但我无法使用func(string{"a"}, 13)之类的内容stringstream导致"a"无法知道如何转换int 1}}到#import<SDWebImage/UIImageView+WebCache.h> 。所以请谨慎使用。

答案 1 :(得分:0)

是的,您可以通过为其所需类型之一添加模板参数,如下所示:

template <typename T1, typename T2> T2 func(T1 a,T2 str) {
 // ... 
}