#include <iostream>
#include <array>
#include <cassert>

using namespace std;

template<typename Q, void (*foo_p)(Q)>
void wrapped(int x){  foo_p(x); }

void foo1(int x){
	if(x < 0){
		cout << "foo(negative numnber)==woot!?\n"; 
	} else {
		for(size_t i=0; i < x; i++)
			cout << i << ". foo1(" << x << ")\n";
	}
}
void foo2(double x){
 cout << "foo2(" << x << ")\n";
}

int main(){
   using foo_t = void (*)(int);
   std::array<foo_t, 2> arr;

   arr[0] = wrapped<int, foo1>;
   arr[1] = wrapped<double, foo2>;

   size_t choice_idx;
   int choice_input;
   cout << "choose an idx: 0, or 1>>";
   cin >> choice_idx;   
   cout << "\nand an input int>>";
   cin >> choice_input;
   assert(choice_idx < arr.size());

   cout << "\n\n";
   arr[choice_idx](choice_input);
   return 0;
}
