x ++ для объекта в C ++ - PullRequest
       2

x ++ для объекта в C ++

1 голос
/ 13 марта 2019

При написании f(x++) мы имеем в виду f(x);++x; Тем не менее, оператор для объекта обычно записывается как

foo operator++(int) {
    foo temp = *this;
    ++*this;
    return temp;
}

Могу ли я заставить его работать как

const foo operator++(int) {
    return *this;
    // when this code done
    ++this;
}

? (Серьезная причина в том, что некоторые пользователи более привыкли к x++, чем ++x, а для объекта обычное решение стоит копирование и деконструкция; другая причина в том, что иногда x++ соответствует значению больше, чем x;++x )

Это решение иногда работает в среде, но иногда дает сбой, не работает с auto и может полагаться на UB. Есть ли лучшее решение?

1 Ответ

2 голосов
/ 13 марта 2019

Это можно сделать, если вы используете вспомогательный класс, деструктор которого заботится о части ++(*this);.

struct IncrementMinder
{
    IncrementMinder(foo* fPtr) : fPtr_(fPtr) {}
    ~IncrementMinder() { ++(*fPtr_); }
    foo* fPtr_;
}

foo operator++(int) {
    InrementMinder minder(this);
    return *this;
    // Destructor of minder takes care of ++(*this)
}

Я думаю, что ваш тест не правильно оформлен.Лучшая демонстрация концепции выглядит следующим образом:

#include <iostream>

struct foo {

   struct IncrementMinder
   {
      IncrementMinder(foo* fPtr) : fPtr_(fPtr) {}
      ~IncrementMinder() { ++(*fPtr_); }
      foo* fPtr_;
   };

   foo(int val) : value(val) {}

   // Not correct.
   // When a reference is returned, const or otherwise, the calling function
   // will get a reference to the object, which will be incremented by the
   // time the reference is used in the calling function.
   // const foo& operator++(int) {

   foo operator++(int) {
      IncrementMinder minder(this);
      return *this;
      // Destructor of minder takes care of ++(*this)
   }

   foo& operator++() {
      ++value;
      return *this;
   }

   operator int() {
      return 0;
   }

   int value;


} bar{20};

void f(const foo& bar) { std::cout << "bar.value: " << bar.value << "\n"; }

int main()
{
   f(bar);

   std::cout << "Using post-increment...\n";

   f(bar++);
   f(bar);;

   std::cout << "Using pre-increment...\n";

   f(++bar);
   f(bar);
}

Вывод с g++ -std=c++14:

bar.value: 20
Using post-increment...
bar.value: 20
bar.value: 21
Using pre-increment...
bar.value: 22
bar.value: 22

Live Demo .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...