#include <iostream>
#include <string>
#include <sstream>
#include <stdexcept>
template <typename MyType> int ToInt (MyType);
template <> int ToInt<int> (int x) { return x; }
template <> int ToInt<std::string> (std::string x) { return std::stoi(x); }
template <> int ToInt<char> (char x) { return std::stoi(std::string(&x, 1)); }
template <typename MyType> MyType FromInt (int);
template <> int FromInt<int> (int x) { return x; }
template <> std::string FromInt<std::string> (int x) {
std::ostringstream oss;
oss << x;
return oss.str();
}
template <> char FromInt<char> (int x) {
static const std::string map("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ");
return map.at(x);
}
template <typename MyType>
MyType GetSum (MyType a, MyType b, MyType c) {
int aa = ToInt(a);
int bb = ToInt(b);
int cc = ToInt(c);
return FromInt<MyType>(aa + bb + cc);
}
int main () {
int a = 5, b = 6, c = 7, d;
char e = '5', f = '6', g = '7', h;
std::string i= "5", j= "6", k= "7", l;
d=GetSum(a,b,c);
std::cout << d << std::endl;
h=GetSum(e,f,g);
std::cout << h << std::endl;
l=GetSum(i,j,k);
std::cout << l << std::endl;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8c3N0cmVhbT4KI2luY2x1ZGUgPHN0ZGV4Y2VwdD4KCnRlbXBsYXRlIDx0eXBlbmFtZSBNeVR5cGU+IGludCBUb0ludCAoTXlUeXBlKTsKdGVtcGxhdGUgPD4gaW50IFRvSW50PGludD4gKGludCB4KSB7IHJldHVybiB4OyB9CnRlbXBsYXRlIDw+IGludCBUb0ludDxzdGQ6OnN0cmluZz4gKHN0ZDo6c3RyaW5nIHgpIHsgcmV0dXJuIHN0ZDo6c3RvaSh4KTsgfQp0ZW1wbGF0ZSA8PiBpbnQgVG9JbnQ8Y2hhcj4gKGNoYXIgeCkgeyByZXR1cm4gc3RkOjpzdG9pKHN0ZDo6c3RyaW5nKCZ4LCAxKSk7IH0KCnRlbXBsYXRlIDx0eXBlbmFtZSBNeVR5cGU+IE15VHlwZSBGcm9tSW50IChpbnQpOwp0ZW1wbGF0ZSA8PiBpbnQgRnJvbUludDxpbnQ+IChpbnQgeCkgeyByZXR1cm4geDsgfQp0ZW1wbGF0ZSA8PiBzdGQ6OnN0cmluZyBGcm9tSW50PHN0ZDo6c3RyaW5nPiAoaW50IHgpIHsKICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvc3M7CiAgICBvc3MgPDwgeDsKICAgIHJldHVybiBvc3Muc3RyKCk7Cn0KdGVtcGxhdGUgPD4gY2hhciBGcm9tSW50PGNoYXI+IChpbnQgeCkgewogICAgc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIG1hcCgiMDEyMzQ1Njc4OUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaIik7CiAgICByZXR1cm4gbWFwLmF0KHgpOwp9Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgTXlUeXBlPgpNeVR5cGUgR2V0U3VtIChNeVR5cGUgYSwgTXlUeXBlIGIsIE15VHlwZSBjKSB7CiAgICBpbnQgYWEgPSBUb0ludChhKTsKICAgIGludCBiYiA9IFRvSW50KGIpOwogICAgaW50IGNjID0gVG9JbnQoYyk7CiAgICByZXR1cm4gRnJvbUludDxNeVR5cGU+KGFhICsgYmIgKyBjYyk7Cn0KCmludCBtYWluICgpIHsKICAgIGludCBhID0gNSwgYiA9IDYsIGMgPSA3LCBkOyAKICAgIGNoYXIgZSA9ICc1JywgZiA9ICc2JywgZyA9ICc3JywgaDsgCiAgICBzdGQ6OnN0cmluZyBpPSAiNSIsIGo9ICI2Iiwgaz0gIjciLCBsOyAKICAKICAgIGQ9R2V0U3VtKGEsYixjKTsKICAgIHN0ZDo6Y291dCA8PCBkIDw8IHN0ZDo6ZW5kbDsKICAKICAgIGg9R2V0U3VtKGUsZixnKTsKICAgIHN0ZDo6Y291dCA8PCBoIDw8IHN0ZDo6ZW5kbDsKICAKICAgIGw9R2V0U3VtKGksaixrKTsKICAgIHN0ZDo6Y291dCA8PCBsIDw8IHN0ZDo6ZW5kbDsKfQo=