【问题标题】:How can I create function templates for the two or more data types?如何为两种或更多数据类型创建函数模板?
【发布时间】:2021-04-13 12:39:45
【问题描述】:

我想使用具有两种或多种数据类型的函数模板。所以我做了一个例子,它获取两个'T'类型数据然后返回'T1'类型数据。这是代码:

#include <iostream>
using namespace std;
template <typename T, typename T2> T get(T2 a, T2 b)
{
    if (a < b)
        return b;
    else
        return a;
}

int main()
{
    cout << get<float, int>(10.2, 20.3);
}

我希望这段代码将两个“int-type”数字中较大的一个返回到“float”类型。 也就是说,我预计结果为“20.0”。但结果是 20。我不明白为什么结果的类型是 'int'。 请更正我的代码以返回“浮点”类型“20.0”。 即我想知道如果输入因子和返回值不同,如何指定返回值的数据类型。

【问题讨论】:

  • 当你调用它时,你明确告诉编译器第二个参数是int
  • 10.220.3 在函数中被强制转换为 int,然后当你 return 时,那些(现在)int 被强制转换为 float,所以你失去了.3在处理中
  • 另外,get(T2 a, T2 b) 应该是 get(T a, T2 b)
  • 非常感谢。现在我可以理解为什么结果的类型是 int 了。但很抱歉,我不知道如何将 T 设置为 float
  • 这段代码只是为了练习。我制作这段代码来制作函数模板,输入参数的类型是T,返回类型是T2

标签: c++ templates


【解决方案1】:

考虑到int 的奇怪输入,您的代码非常好。看看输出:

#include <iostream>
#include <boost/type_index.hpp>
using namespace std;
using boost::typeindex::type_id_with_cvr;

template <typename T, typename T2> T get(T2 a, T2 b)
{
    if (a < b)
        return b;
    else
        return a;
}

int main()
{
  float test = 20.0;
  
  cout << get<float, int>(10.2, 20.3) << " "
       << type_id_with_cvr<decltype(get<float,int>(10.2,20.3))>().pretty_name() << endl;
  cout << test << endl;
}

这是

20 float
20

所以,当然,你的函数的返回类型是浮点数,输出就是 cout 将如何显示给你。但是您知道,您可以使用#include &lt;iomanip&gt; 高度自定义 cout 打印数据的方式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-06
    • 1970-01-01
    • 2022-09-30
    • 1970-01-01
    • 2017-12-13
    • 1970-01-01
    • 2021-11-02
    • 1970-01-01
    相关资源
    最近更新 更多