Оболочка C++ с перегруженным оператором =

Я пытаюсь разработать довольно простой (на данный момент) класс-оболочку вокруг int и надеялся перегрузить оператор =, чтобы добиться чего-то вроде следующего:

class IntWrapper
{
    ...
    private:
        int val;
}

int main ( )
{
    IntWrapper a;
    int b;

    a = 5; // uses overloaded = to implement setter
    b = a; // uses overloaded = to implement getter
}

Однако я соображаю, что это невозможно. Реализация сеттера довольно проста, например:

class IntWrapper
{
    ...
    IntWrapper& operator = (int rhs) { this.val = rhs; return *this; }
    ...
}

Однако из того, что я собираю в Google, нет никакого способа сделать геттер таким образом. Насколько я понимаю, это связано с тем, что оператор = может быть переопределен только для назначения переменной to, а поскольку int является примитивным типом, мы не можем переопределить его реализацию = по умолчанию. Это верно? Если нет, то как мне написать геттер?

Если это правильно, есть ли у кого-нибудь элегантные предложения для чего-то подобного? Ближайшее, что я могу найти, это перегрузка оператора преобразования:

class IntWrapper
{
    ...
    operator int( ) { return this.val; }
    ...
}

int main ( )
{
    ...
    b = (int) a;
    ...
}

Однако мне это кажется довольно бессмысленным, так как это едва ли лучше, чем простой метод getVal().

Спасибо за любые предложения!


person Mac    schedule 03.03.2010    source источник


Ответы (2)


Вам не нужно приведение, чтобы вызвать функцию преобразования. Равнина

b = a;

вызовет и его. Таким образом, я вижу, что это более удобно использовать, чем функцию getVal. Хотя я обычно не использую функции преобразования. Я бы предпочел явную функцию getVal. В частности, рассмотрим этот

struct W {
  W(int);
  operator int();
};

int main() {
  W w = 42;
  int a = true ? 0 : w; // Ambiguity! What conversion direction?
}

Быстро выходит из-под контроля...

person Johannes Schaub - litb    schedule 03.03.2010

То, что вы предлагаете, - это путь, и я использую его все время. Вам не нужно приводить a к int. Компилятор достаточно умен, чтобы увидеть, что b является целым числом, и он автоматически вызовет для вас оператор оператора int cast.

person miked    schedule 03.03.2010