多种数据类型的单个模板对象

single template object for multiple data types

本文关键字:对象 单个模 数据类型      更新时间:2023-10-16
class mypair {
    T a, b;
  public:
    mypair (T first, T second)
      {a=first; b=second;}
    T getmax ();
};
template <class T>
T mypair<T>::getmax ()
{
  T retval;
  retval = a>b? a : b;
  return retval;
}
int main () {
  int i;
  cin>>i;
  if(i==0)
      mypair <int> myobject (100, 75);
  else
      mypair <float> myobject (100, 75);
  cout << myobject.getmax();
  return 0;
}
我想根据 i 的值创建模板类

的单个对象,如果 i 的值为 0,则创建一个数据类型为 int else float 的模板类。上面的程序抛出了一个错误"myobject",没有在我调用 getmax 函数的最后一行的倒数第二行中声明。

我怎样才能做到这一点>

为什么不编写一个函数模板来完成这项工作?

template <typename T>
doStuff()
{
  mypair <T> myobject (100, 75);
  std::cout << myobject.getmax();
}

然后

if(i==0)
  doStuff<int>();
else
  doStuff<float>();

问题是范围:

if(i==0)
{
      mypair <int> myobject (100, 75);
} // myobject is now out of scope and unusable
  else
{
      mypair <float> myobject (100, 75);
}  // myobject is now out of scope and unusable

您需要为模板声明非模板基然后你可以声明一个指向基的指针在你的 if 子句中做一个新的然后你可以在下面的代码中使用指针

顺便说一句,即使对于单行块,始终包含{}通常也很有帮助

这是因为 if 和 else 情况的范围。你可以通过这样做来实现这一点

if(i==0){
  mypair <int> myobject (100, 75);
  cout << myobject.getmax();
} 
else{
  mypair <float> myobject (100, 75);
  cout << myobject.getmax();
}

由于对象在 if 的范围内是活的,否则它之外的范围将是死的。

if{
     // alive scope
 }
 //dead scope