在调用C ++运算符重载时识别调用上下文/用法

时间:2018-02-02 22:38:43

标签: c++ operator-overloading

无论我想要的是不是坏习惯,我想知道是否可以区分以下情况:

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。

有什么想法吗? (我真的试了很多,以避免重复的问题)

1 个答案:

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