#include <iostream>
#include <functional>

template <typename nextF>
class Adder {
	int sn;
	static nextF next;
	public:
		Adder(int n)
			: sn(n)
		{
		}
		
		int getNext() {
			sn = (*next)(sn);
			return sn;
		}
};

auto govnoLambda = [](int x) -> int { return x + 1;};

template <>
decltype(&govnoLambda) Adder<decltype(&govnoLambda)>::next = &govnoLambda;

int main() {
	Adder< decltype(&govnoLambda) > ad(10);
	std::cout << ad.getNext();
	return 0;
}