#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](13) << " " << funcs[2](12) << std::endl;
std::cout << "long long(int) "<< funcs[4](12) << " " << funcs[5](13) << std::endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8ZnVuY3Rpb25hbD4KI2luY2x1ZGUgPHNzdHJlYW0+CiNpbmNsdWRlIDx2ZWN0b3I+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgppbnQgZjEoaW50IHgpIHsKICByZXR1cm4geDsKfQoKc3RyaW5nIGYyKGludCB4KSB7CiAgcmV0dXJuIHN0ZDo6dG9fc3RyaW5nKHgpOwp9Cgpsb25nIGxvbmcgZjMoaW50IHgpIHsKICByZXR1cm4geDsKfQoKdGVtcGxhdGU8Y2xhc3MgVD4KZnVuY3Rpb248c3RyaW5nKGludCk+IGNvbnYoZnVuY3Rpb248VChpbnQpPiBmKSB7CiAgICByZXR1cm4gWyZdKGludCB4KSAtPiBzdHJpbmcgewogICAgICAgIHN0cmluZ3N0cmVhbSBzczsKICAgICAgICBzcyA8PCBmKHgpOwogICAgICAgIHJldHVybiBzcy5zdHIoKTsKICAgIH07Cn0KCnRlbXBsYXRlPGNsYXNzIFQ+CmZ1bmN0aW9uPHN0cmluZyhpbnQpPiBjb252MShUKCpmKShpbnQpKSB7CiAgICByZXR1cm4gW2ZdKGludCB4KSAtPiBzdHJpbmcgewogICAgICAgIHN0cmluZ3N0cmVhbSBzczsKCXN0ZDo6ZnVuY3Rpb248VChpbnQpPiBfZihmKTsKICAgICAgICBzcyA8PCBfZih4KTsKICAgICAgICByZXR1cm4gc3Muc3RyKCk7CiAgICB9Owp9CgppbnQgbWFpbigpIHsKCiAgICB2ZWN0b3I8ZnVuY3Rpb248c3RyaW5nKGludCk+PiBmdW5jcyA9IHsKICAgICAgY29udihzdGQ6OmZ1bmN0aW9uPGludChpbnQpPihmMSkpLAogICAgICBjb252MShmMSksCiAgICAgIGNvbnYoc3RkOjpmdW5jdGlvbjxzdHJpbmcoaW50KT4oZjIpKSwKICAgICAgY29udjEoZjIpLAogICAgICBjb252KHN0ZDo6ZnVuY3Rpb248bG9uZyBsb25nKGludCk+KGYzKSksCiAgICAgIGNvbnYxKGYzKSwKICAgIH07CiAgICBzdGQ6OmNvdXQgPDwgImludChpbnQpICIgPDwgZnVuY3NbMF0oMTIpIDw8ICIgIiA8PCBmdW5jc1sxXSgxMykgPDwgc3RkOjplbmRsOwogICAgc3RkOjpjb3V0IDw8ICJzdHJpbmcoaW50KSAiPDwgZnVuY3NbMl0oMTMpIDw8ICIgIiA8PCBmdW5jc1syXSgxMikgPDwgc3RkOjplbmRsOwogICAgc3RkOjpjb3V0IDw8ICJsb25nIGxvbmcoaW50KSAiPDwgZnVuY3NbNF0oMTIpIDw8ICIgIiA8PCBmdW5jc1s1XSgxMykgPDwgc3RkOjplbmRsOwogICAgcmV0dXJuIDA7Cn0K