#include <iostream>

struct foo {

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

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

   // Not correct.
   // 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);
}
