#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 [&](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;
std::function<T(int)> _f(f);
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;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8ZnVuY3Rpb25hbD4KI2luY2x1ZGUgPHNzdHJlYW0+CiNpbmNsdWRlIDx2ZWN0b3I+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgppbnQgZjEoaW50IHgpIHsKICByZXR1cm4geDsKfQoKc3RyaW5nIGYyKGludCB4KSB7CiAgcmV0dXJuIHN0ZDo6dG9fc3RyaW5nKHgpOwp9Cgpsb25nIGxvbmcgZjMoaW50IHgpIHsKICByZXR1cm4geDsKfQoKdGVtcGxhdGU8Y2xhc3MgVD4KZnVuY3Rpb248c3RyaW5nKGludCk+IGNvbnYoZnVuY3Rpb248VChpbnQpPiBmKSB7CiAgICByZXR1cm4gWyZdKGludCB4KSAtPiBzdHJpbmcgewogICAgICAgIHN0cmluZ3N0cmVhbSBzczsKICAgICAgICBzcyA8PCBmKHgpOwogICAgICAgIHJldHVybiBzcy5zdHIoKTsKICAgIH07Cn0KCnRlbXBsYXRlPGNsYXNzIFQ+CmZ1bmN0aW9uPHN0cmluZyhpbnQpPiBjb252MShUKCpmKShpbnQpKSB7CiAgICByZXR1cm4gW2ZdKGludCB4KSAtPiBzdHJpbmcgewogICAgICAgIHN0cmluZ3N0cmVhbSBzczsKCSAgICBzdGQ6OmZ1bmN0aW9uPFQoaW50KT4gX2YoZik7CiAgICAgICAgc3MgPDwgX2YoeCk7CiAgICAgICAgcmV0dXJuIHNzLnN0cigpOwogICAgfTsKfQoKaW50IG1haW4oKSB7CgogICAgdmVjdG9yPGZ1bmN0aW9uPHN0cmluZyhpbnQpPj4gZnVuY3MgPSB7CiAgICAgIGNvbnYoc3RkOjpmdW5jdGlvbjxpbnQoaW50KT4oZjEpKSwKICAgICAgY29udjEoZjEpLAogICAgICBjb252KHN0ZDo6ZnVuY3Rpb248c3RyaW5nKGludCk+KGYyKSksCiAgICAgIGNvbnYxKGYyKSwKICAgICAgY29udihzdGQ6OmZ1bmN0aW9uPGxvbmcgbG9uZyhpbnQpPihmMykpLAogICAgICBjb252MShmMyksCiAgICB9OwogICAgc3RkOjpjb3V0IDw8ICJpbnQoaW50KSAiIDw8IGZ1bmNzWzBdKDEyKSA8PCAiICIgPDwgZnVuY3NbMV0oMTMpIDw8IHN0ZDo6ZW5kbDsKICAgIHN0ZDo6Y291dCA8PCAic3RyaW5nKGludCkgIjw8IGZ1bmNzWzJdKDEyKSA8PCAiICIgPDwgZnVuY3NbM10oMTMpIDw8IHN0ZDo6ZW5kbDsKICAgIHN0ZDo6Y291dCA8PCAibG9uZyBsb25nKGludCkgIjw8IGZ1bmNzWzRdKDEyKSA8PCAiICIgPDwgZnVuY3NbNV0oMTMpIDw8IHN0ZDo6ZW5kbDsKICAgIHJldHVybiAwOwp9Cg==