#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;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8YXJyYXk+CiNpbmNsdWRlIDxjYXNzZXJ0PgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnRlbXBsYXRlPHR5cGVuYW1lIFEsIHZvaWQgKCpmb29fcCkoUSk+CnZvaWQgd3JhcHBlZChpbnQgeCl7ICBmb29fcCh4KTsgfQoKdm9pZCBmb28xKGludCB4KXsKCWlmKHggPCAwKXsKCQljb3V0IDw8ICJmb28obmVnYXRpdmUgbnVtbmJlcik9PXdvb3QhP1xuIjsgCgl9IGVsc2UgewoJCWZvcihzaXplX3QgaT0wOyBpIDwgeDsgaSsrKQoJCQljb3V0IDw8IGkgPDwgIi4gZm9vMSgiIDw8IHggPDwgIilcbiI7Cgl9Cn0Kdm9pZCBmb28yKGRvdWJsZSB4KXsKIGNvdXQgPDwgImZvbzIoIiA8PCB4IDw8ICIpXG4iOwp9CgppbnQgbWFpbigpewogICB1c2luZyBmb29fdCA9IHZvaWQgKCopKGludCk7CiAgIHN0ZDo6YXJyYXk8Zm9vX3QsIDI+IGFycjsKCiAgIGFyclswXSA9IHdyYXBwZWQ8aW50LCBmb28xPjsKICAgYXJyWzFdID0gd3JhcHBlZDxkb3VibGUsIGZvbzI+OwoKICAgc2l6ZV90IGNob2ljZV9pZHg7CiAgIGludCBjaG9pY2VfaW5wdXQ7CiAgIGNvdXQgPDwgImNob29zZSBhbiBpZHg6IDAsIG9yIDE+PiI7CiAgIGNpbiA+PiBjaG9pY2VfaWR4OyAgIAogICBjb3V0IDw8ICJcbmFuZCBhbiBpbnB1dCBpbnQ+PiI7CiAgIGNpbiA+PiBjaG9pY2VfaW5wdXQ7CiAgIGFzc2VydChjaG9pY2VfaWR4IDwgYXJyLnNpemUoKSk7CgogICBjb3V0IDw8ICJcblxuIjsKICAgYXJyW2Nob2ljZV9pZHhdKGNob2ljZV9pbnB1dCk7CiAgIHJldHVybiAwOwp9Cg==