#include <iostream>
#include <string>
#include <type_traits>
using namespace std;
template<typename U>
class A
{
public:
static_assert(!std::is_same<int, U>::value && !std::is_same<double,U>::value,
"Template argument cannot be <int> or <double>.");
A(const U& u) : u(u) {};
explicit operator U() { return u; }
explicit operator int() { return i; }
explicit operator double() { return d; }
private:
U u;
int i = 5;
double d = 3.14;
};
int main()
{
A<string> a("name");
cout << double(a) << '\n';
cout << int(a) << '\n';
cout << string(a) << '\n';
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8dHlwZV90cmFpdHM+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKdGVtcGxhdGU8dHlwZW5hbWUgVT4KY2xhc3MgQQp7CnB1YmxpYzoKCXN0YXRpY19hc3NlcnQoIXN0ZDo6aXNfc2FtZTxpbnQsIFU+Ojp2YWx1ZSAmJiAhc3RkOjppc19zYW1lPGRvdWJsZSxVPjo6dmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGVtcGxhdGUgYXJndW1lbnQgY2Fubm90IGJlIDxpbnQ+IG9yIDxkb3VibGU+LiIpOwoJQShjb25zdCBVJiB1KSA6IHUodSkge307CglleHBsaWNpdCBvcGVyYXRvciBVKCkgeyByZXR1cm4gdTsgfQoJZXhwbGljaXQgb3BlcmF0b3IgaW50KCkgeyByZXR1cm4gaTsgfQoJZXhwbGljaXQgb3BlcmF0b3IgZG91YmxlKCkgeyByZXR1cm4gZDsgfQoKcHJpdmF0ZToKCVUgdTsKCWludCBpID0gNTsKCWRvdWJsZSBkID0gMy4xNDsKfTsKCmludCBtYWluKCkKewoJQTxzdHJpbmc+IGEoIm5hbWUiKTsKCWNvdXQgPDwgZG91YmxlKGEpIDw8ICdcbic7Cgljb3V0IDw8IGludChhKSA8PCAnXG4nOwoJY291dCA8PCBzdHJpbmcoYSkgPDwgJ1xuJzsKCXJldHVybiAwOwp9Cg==