#include <functional>
#include <iostream>

template <typename VAL, typename RET, typename ...ARGS>
struct wrapper_helper
{
 static std::function<RET(ARGS...)> wrapper(VAL v)
 {
   return [&](ARGS...args) -> RET { return v(args...); };
 }
};

template <typename VAL, typename ...ARGS> 
struct wrapper_helper<VAL,void,ARGS...>
{
 static std::function<void(ARGS...)> wrapper(VAL v)
 {
   return [&](ARGS...args) -> void { v(args...); };
 }
};

void print_n(int n){
	std::cout << n << std::endl;
}

int main()
{	
	wrapper_helper<void(int),void,int>::wrapper(print_n)(10);
	return 0;
}