#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);
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKc3RydWN0IGZvbyB7CgogICBzdHJ1Y3QgSW5jcmVtZW50TWluZGVyCiAgIHsKICAgICAgSW5jcmVtZW50TWluZGVyKGZvbyogZlB0cikgOiBmUHRyXyhmUHRyKSB7fQogICAgICB+SW5jcmVtZW50TWluZGVyKCkgeyArKygqZlB0cl8pOyB9CiAgICAgIGZvbyogZlB0cl87CiAgIH07CgogICBmb28oaW50IHZhbCkgOiB2YWx1ZSh2YWwpIHt9CgogICAvLyBOb3QgY29ycmVjdC4KICAgLy8gY29uc3QgZm9vJiBvcGVyYXRvcisrKGludCkgewogICBmb28gb3BlcmF0b3IrKyhpbnQpIHsKICAgICAgSW5jcmVtZW50TWluZGVyIG1pbmRlcih0aGlzKTsKICAgICAgcmV0dXJuICp0aGlzOwogICAgICAvLyBEZXN0cnVjdG9yIG9mIG1pbmRlciB0YWtlcyBjYXJlIG9mICsrKCp0aGlzKQogICB9CgogICBmb28mIG9wZXJhdG9yKysoKSB7CiAgICAgICsrdmFsdWU7CiAgICAgIHJldHVybiAqdGhpczsKICAgfQoKICAgb3BlcmF0b3IgaW50KCkgewogICAgICByZXR1cm4gMDsKICAgfQoKICAgaW50IHZhbHVlOwoKCn0gYmFyezIwfTsKCnZvaWQgZihjb25zdCBmb28mIGJhcikgeyBzdGQ6OmNvdXQgPDwgImJhci52YWx1ZTogIiA8PCBiYXIudmFsdWUgPDwgIlxuIjsgfQoKaW50IG1haW4oKQp7CiAgIGYoYmFyKTsKCiAgIHN0ZDo6Y291dCA8PCAiVXNpbmcgcG9zdC1pbmNyZW1lbnQuLi5cbiI7CgogICBmKGJhcisrKTsKICAgZihiYXIpOzsKCiAgIHN0ZDo6Y291dCA8PCAiVXNpbmcgcHJlLWluY3JlbWVudC4uLlxuIjsKCiAgIGYoKytiYXIpOwogICBmKGJhcik7Cn0K