添加两种数据类型的C ++模板问题
我有一个带有重载+运算符的模板类。这是工作正常,当我添加两个int或两个双打。
I have a template class with an overloaded + operator. This is working fine when I am adding two ints or two doubles. How do I get it to add and int and a double and return the 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;
你会进入c ++的部分,这可能会导致很多问题发布到StackOverflow :)想想很长很难,如果你真的想这样做。
Here be dragons. You're getting into parts of c++ that will probably result in a lot of questions posted to StackOverflow :) Think long and hard about if you really want to do this.
从容易的部分开始,你想允许 operator +
添加不总是与 T
相同的类型。开始:
Start with the easy part, you want to allow operator+
to add types that are not always the same as T
. Start with this:
template <typename T2>
TemplateTest<T> operator+(const TemplateTest<T2>& rhs) {
return TemplateTest<T>(this->x + rhs.x);
}
注意,这是 T2
以及 T
。添加 doubleTt1 + intTt2
时, T
将为 doubleTt1
T2
将会是 intTt2
。
Note that this is templated on T2
as well as T
. When adding doubleTt1 + intTt2
, T
will be doubleTt1
and T2
will be intTt2
.
这是整个方法的大问题。
But here's the big problem with this whole approach.
现在,当你添加一个 double
int
,你期望什么? 4 + 2.3 = 6.3
?或 4 + 2.3 = 6
?谁会期望 6
?你的用户应该,因为你将双引号转换为 int
,从而失去小数部分。有时。取决于哪个操作数是第一个。如果用户写 2.3 + 4
,他们会得到(如预期的) 6.3
。令人困惑的图书馆让悲伤的用户。如何最好地处理呢? I dunno ...
Now, when you add a double
and an int
, what do you expect? 4 + 2.3 = 6.3
? or 4 + 2.3 = 6
? Who would expect 6
? Your users should, because you're casting the double back to an int
, thus losing the fractional part. Sometimes. Depending on which operand is first. If the user wrote 2.3 + 4
, they would get (as expected?) 6.3
. Confusing libraries make for sad users. How best to deal with that? I dunno...