#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;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8ZnVuY3Rpb25hbD4KI2luY2x1ZGUgPHNzdHJlYW0+CiNpbmNsdWRlIDx2ZWN0b3I+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgppbnQgZjEoaW50IHgpIHsKICByZXR1cm4geDsKfQoKc3RyaW5nIGYyKGludCB4KSB7CiAgcmV0dXJuIHN0ZDo6dG9fc3RyaW5nKHgpOwp9Cgpsb25nIGxvbmcgZjMoaW50IHgpIHsKICByZXR1cm4geDsKfQoKdGVtcGxhdGU8Y2xhc3MgVD4KZnVuY3Rpb248c3RyaW5nKGludCk+IGNvbnYoZnVuY3Rpb248VChpbnQpPiBmKSB7CiAgICByZXR1cm4gW2ZdKGludCB4KSAtPiBzdHJpbmcgewogICAgICAgIHN0cmluZ3N0cmVhbSBzczsKICAgICAgICBzcyA8PCBmKHgpOwogICAgICAgIHJldHVybiBzcy5zdHIoKTsKICAgIH07Cn0KCnRlbXBsYXRlPGNsYXNzIFQ+CmZ1bmN0aW9uPHN0cmluZyhpbnQpPiBjb252MShUKCpmKShpbnQpKSB7CiAgICByZXR1cm4gW2ZdKGludCB4KSAtPiBzdHJpbmcgewogICAgICAgIHN0cmluZ3N0cmVhbSBzczsKICAgICAgICBzcyA8PCBmKHgpOwogICAgICAgIHJldHVybiBzcy5zdHIoKTsKICAgIH07Cn0KCmludCBtYWluKCkgewoKICAgIHZlY3RvcjxmdW5jdGlvbjxzdHJpbmcoaW50KT4+IGZ1bmNzID0gewogICAgICBjb252KHN0ZDo6ZnVuY3Rpb248aW50KGludCk+KGYxKSksCiAgICAgIGNvbnYxKGYxKSwKICAgICAgY29udihzdGQ6OmZ1bmN0aW9uPHN0cmluZyhpbnQpPihmMikpLAogICAgICBjb252MShmMiksCiAgICAgIGNvbnYoc3RkOjpmdW5jdGlvbjxsb25nIGxvbmcoaW50KT4oZjMpKSwKICAgICAgY29udjEoZjMpLAogICAgfTsKICAgIHN0ZDo6Y291dCA8PCAiaW50KGludCkgIiA8PCBmdW5jc1swXSgxMikgPDwgIiAiIDw8IGZ1bmNzWzFdKDEzKSA8PCBzdGQ6OmVuZGw7CiAgICBzdGQ6OmNvdXQgPDwgInN0cmluZyhpbnQpICI8PCBmdW5jc1syXSgxMikgPDwgIiAiIDw8IGZ1bmNzWzNdKDEzKSA8PCBzdGQ6OmVuZGw7CiAgICBzdGQ6OmNvdXQgPDwgImxvbmcgbG9uZyhpbnQpICI8PCBmdW5jc1s0XSgxMikgPDwgIiAiIDw8IGZ1bmNzWzVdKDEzKSA8PCBzdGQ6OmVuZGw7CiAgICByZXR1cm4gMDsKfQo=