#include <iostream>
#include <functional>

class VoidType{

public:
	template<class ...Arge>
	virtual int operator()(Arge ...Arges){return 0; }//戻り型がチープ。継承先の戻り型を設定したい。
};


template<class F>
class AnyFunction:VoidType{
	std::function<F> Fun;

public:
	AnyFunction(std::function<F> F){
		Fun = F;
	}
	AnyFunction() = delete;

	template<class ...Arge>
	typename std::function<F>::result_type operator ()(Arge ...Arges){
		return Fun(Arges...);
	}
};

int main(){
	AnyFunction<int(int)> F([](int N)->int{std::cout << N << std::endl; return N; });
	VoidType& Fn = F;
	int R = Fn(10);


	return 0;
}