#include <iostream>
#include <functional>
#include <sstream>
#include <vector>
using namespace std;

int f1(int x) {
  return x;
}

string f2(int x) {
  return std::to_string(x);
}

long long f3(int x) {
  return x;
}

template<class T>
function<string(int)> conv(function<T(int)> f) {
    return [f](int x) -> string {
        stringstream ss;
        ss << f(x);
        return ss.str();
    };
}

template<class T>
function<string(int)> conv1(T(*f)(int)) {
    return [f](int x) -> string {
        stringstream ss;
        ss << f(x);
        return ss.str();
    };
}

int main() {

    vector<function<string(int)>> funcs = {
      conv(std::function<int(int)>(f1)),
      conv1(f1),
      conv(std::function<string(int)>(f2)),
      conv1(f2),
      conv(std::function<long long(int)>(f3)),
      conv1(f3),
    };
    std::cout << "int(int) " << funcs[0](12) << " " << funcs[1](13) << std::endl;
    std::cout << "string(int) "<< funcs[2](12) << " " << funcs[3](13) << std::endl;
    std::cout << "long long(int) "<< funcs[4](12) << " " << funcs[5](13) << std::endl;
    return 0;
}
