无论我想要的是不是坏习惯,我想知道是否可以区分以下情况:
MyType A, B, C;
Case1:
B << A;
Case2:
C << (B << A);
在Case1中我想要的是B是MODIFIED,以便它与A连接。 另一方面,在Case2中,我希望B不被修改,而是返回一个等同于'与B连接的B'的临时对象(并且修改C并与该临时对象连接)。
这可能吗?如果是这样,运算符在C ++中重载语法和变体应该是什么?我尝试了运营商RHS params的r值版本;和const /非const重载;还有&amp; /&amp;&amp;后固定方法来区分过载操作员的LHS。
有什么想法吗? (我真的试了很多,以避免重复的问题)
答案 0 :(得分:1)
您可以使用其他类型。
#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;
}