39 lines
706 B
C++
39 lines
706 B
C++
#include <cassert>
|
|
#include <iostream>
|
|
#include <ostream>
|
|
// requires C++23 to compile
|
|
class A {
|
|
long long counter = 0;
|
|
|
|
public:
|
|
A() : counter{0} {}
|
|
A operator()() {
|
|
A ret = *this;
|
|
ret.counter++;
|
|
return ret;
|
|
}
|
|
// requires C++23 to compile
|
|
A operator[](int _ = 0) {
|
|
A ret = *this;
|
|
ret.counter--;
|
|
return ret;
|
|
}
|
|
// friend std::ostream &operator<<(std::ostream &lhs, A const &rhs) {
|
|
// lhs << rhs.counter;
|
|
// return lhs;
|
|
// }
|
|
operator long long() { return counter; }
|
|
};
|
|
|
|
int main(void) {
|
|
A a;
|
|
assert(a == 0);
|
|
assert(a[] == -1);
|
|
assert(a[]() == 0);
|
|
assert(a[]()() == 1);
|
|
int i = a;
|
|
assert(i == 0);
|
|
i = a()()();
|
|
assert(i == 3);
|
|
return 0;
|
|
}
|