我想要的是不好的做法,我想知道是否可以区分以下情况:

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;
}

10-05 22:27
查看更多