我想要的是不好的做法,我想知道是否可以区分以下情况:
MyType A, B, C;
Case1:
B << A;
Case2:
C << (B << A);
在案例1中,我想要的是B被修改为与A串联。
另一方面,在Case2中,我希望不对B进行修改,而是返回一个等效于'B与A串联的临时对象(并且对C进行修改并与该临时对象串联)。
这可能吗?如果是这样,那么C ++中的运算符重载语法和变体应该是什么?我尝试了运营商RHS参数的r值版本;和const / non-const重载;以及&/ &&后缀法来判别过载算子的LHS。
有任何想法吗?
(我为避免重复的问题做了很多尝试)
最佳答案
您可以使用其他类型。
#include <string>
#include <iostream>
template<typename T>
class MyTypeHelper
{
public:
T x;
T* y;
MyTypeHelper(T* t) : x(*t), y(t)
{
}
};
class MyType
{
public:
std::string x;
MyTypeHelper<MyType> operator<<(MyType& i)
{
MyTypeHelper<MyType> h(this);
x += i.x;
return h;
}
MyTypeHelper<MyType> operator<<(MyTypeHelper<MyType>& i)
{
MyTypeHelper<MyType> h(this);
x += i.y->x;
*(i.y) = i.x;
return h;
}
};
int main(int argc, char* argv[])
{
{
MyType A, B, C;
A.x = "A";
B.x = "B";
C.x = "C";
B << A;
std::cout << A.x << " " << B.x << " " << C.x << std::endl;
}
{
MyType A, B, C;
A.x = "A";
B.x = "B";
C.x = "C";
C << (B << A);
std::cout << A.x << " " << B.x << " " << C.x << std::endl;
}
return 0;
}