【问题标题】:In C++, is it possible to pass in two different data types to a template function?在 C++ 中,是否可以将两种不同的数据类型传递给模板函数?
【发布时间】:2013-12-16 00:06:14
【问题描述】:

我正在尝试计算用户传入的两个数值的绝对值,但允许用户输入多种数据类型(即整数和双精度,或字符和浮点数)。我最初的想法是使用类似这样的函数:

template <class T1, class T2>
void findAbs(const T1& var1, const T2& var2)
{
    cout<<"Enter two numbers: "<<endl;
    cin>>var1>>var2;

   cout<<abs(var1)<<" "<<abs(var2)<<endl;
}

如果这是正确的方法,我不知道如何在主函数中调用它,因为我似乎必须将参数声明为一种或另一种数据类型。任何帮助将不胜感激!

【问题讨论】:

  • 你也应该向我们展示你如何调用 findAbs

标签: c++ function templates types


【解决方案1】:

是的,但这取决于您传入的类型是否会导致一段有效的代码。在您的脑海中展开模板(或将其输入,无论如何)。对 T1T2 类型的变量调用 abs 有意义吗?它会编译吗?打电话给cin 怎么样?如果是这样,那么是的,您的代码将起作用。

【讨论】:

    【解决方案2】:

    我不知道如何在主函数中调用它,因为我似乎必须将参数声明为一种或另一种数据类型。

    不,在这种情况下可以推导出模板参数。但主要问题是std::cinoperator&gt;&gt; 修改了参数,因此您不应该声明它们const

    template <class T1, class T2>
    void findAbs(T1& var1, T2& var2) {
        std::cout << "Enter two numbers: " << std::endl;
        std::cin >> var1 >> var2;
        std::cout << std::abs(var1) << ' ' << std::abs(var2) << std::endl;
    }
    

    那么你应该可以调用:

    int x, y;
    findAbs(x, y);
    

    考虑为两个参数使用单个模板参数可能是明智的。

    【讨论】:

      【解决方案3】:

      首先,您的示例无法编译,因为您通过 const-reference 获取参数,然后尝试从流中读取它们。您应该改为通过非常量引用来获取它们。

      解决了这个问题,您可以像这样简单地使用函数:

      int main()
      {
        int i;
        float f;
        double d;
        char c;
      
        findAbs(i, f);
        findAbs(c, d);
        findAbs(d, i);
        //etc.
      }
      

      当然,参数的类型必须在每个调用站点中都是已知的。模板是纯粹的编译时结构。如果您希望以某种方式使用模板来区分最终用户键入的 c42-3.14,那么您不能,因为这是运行时信息。 p>

      【讨论】:

      • 谢谢!正是我想要的。不确定我是否可以以某种方式合并运行时信息。
      猜你喜欢
      • 2017-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-24
      • 1970-01-01
      • 2021-11-16
      • 1970-01-01
      相关资源
      最近更新 更多