#include using namespace std; template class Number { template friend Number &operator++(Number &); public: using iterator_category = forward_iterator_tag; using value_type = T; using difference_type = ptrdiff_t; using pointer = const T *; using reference = const T &; Number(T a) : dat(a) {} bool operator==(const Number &o) const { return dat == *o; } bool operator!=(const Number &o) const { return dat != *o; } const T &operator*() const { return dat; } Number operator+(ptrdiff_t dt) { return Number(dat + dt); } private: T dat; void _plusplus() { ++dat; } }; template Number &operator++(Number &it) { it._plusplus(); return it; } int main() { auto cmp = [](int a, int x) { return a <= x; }; cout << *lower_bound(Number(1), Number(5), 3, cmp); // cout << 3 + 1; return 0; }