gpt4 book ai didi

C++模板问题添加两种数据类型

转载 作者:IT老高 更新时间:2023-10-28 22:32:31 26 4
gpt4 key购买 nike

我有一个带有重载 + 运算符的模板类。当我添加两个整数或两个 double 时,这工作正常。如何让它添加和 int 和一个 double 并返回 double ?

template <class T>
class TemplateTest
{
private:
T x;

public:

TemplateTest<T> operator+(const TemplateTest<T>& t1)const
{
return TemplateTest<T>(x + t1.x);
}
}

in my main function i have

void main()
{
TemplateTest intTt1 = TemplateTest<int>(2);
TemplateTest intTt2 = TemplateTest<int>(4);
TemplateTest doubleTt1 = TemplateTest<double>(2.1d);
TemplateTest doubleTt2 = TemplateTest<double>(2.5d);

std::cout << intTt1 + intTt2 << /n;
std::cout << doubleTt1 + doubleTt2 << /n;
}

我也希望能够做到这一点

std::cout <<  doubleTt1 + intTt2 << /n;

最佳答案

Stephen 已经很好地解释了您可能遇到的问题。您可以为模板的所有实例化的所有可能组合定义重载(因此,您可以有效地为 double + double、int + double、double + int 等定义运算符)。这可能会很快变得笨拙,并且很难跟踪支持哪些组合。

您最好使用名为 Add() 之类的非成员函数。这样做的好处是您可以指定返回类型。缺点是您必须指定返回类型。 :-) 不过,总的来说,这比自动执行意外转换要好。

template <typename R, typename T, typename U>
TemplateTest<R> Add(const TemplateTest<T>& t, const TemplateTest<U>& u)
{
return TemplateTest<R>(t.x + u.x);
}

调用为:

std::cout << Add<double>(intTt1, doubleTt1) << std::endl;

C++0x 将添加对许多语言功能的支持,这将使这变得更加简单,并允许您编写合理的 operator+ 重载:

template <typename T, typename U>
auto operator+(const TemplateTest<T>& t, const TemplateTest<U>& u)
-> TemplateTest<decltype(t.x + u.x)>
{
return TemplateTest<decltype(t.x + u.x)>(t.x + u.x);
}

这将确保执行通常的算术转换(整数提升、转换为浮点等)并最终得到预期的结果类型。

您的 C++ 实现可能已经支持这些 C++0x 特性;您需要查阅您正在使用的任何编译器的文档。

关于C++模板问题添加两种数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3030697/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com