#include <type_traits>
#include <string>
#include <iostream>
using namespace std;
void testString(string value) {
cout << "A string: " << value << endl;
}
void testInt(int value) {
cout << "An int: " << value << endl;
}
template <typename U>
void testOther(U value) {
cout << "Unknown type: " << value << endl;
}
template <typename T>
class Test {
public:
constexpr Test(T value) : value(value) {}
void test() {
if (is_same<T, string>::value) {
string &_value = (*reinterpret_cast<string *>(&value));
testString(_value);
} else if (is_same<T, int>::value) {
int &_value = (*reinterpret_cast<int *>(&value));
testInt(_value);
} else {
testOther(value);
}
}
private:
T value;
};
int main() {
Test<string>("Hello, world!").test();
Test<int>(42).test();
Test<float>(42.1).test();
}
I2luY2x1ZGUgPHR5cGVfdHJhaXRzPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8aW9zdHJlYW0+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKdm9pZCB0ZXN0U3RyaW5nKHN0cmluZyB2YWx1ZSkgewogICAgY291dCA8PCAiQSBzdHJpbmc6ICIgPDwgdmFsdWUgPDwgZW5kbDsKfQoKdm9pZCB0ZXN0SW50KGludCB2YWx1ZSkgewogICAgY291dCA8PCAiQW4gaW50OiAiIDw8IHZhbHVlIDw8IGVuZGw7Cn0KCnRlbXBsYXRlIDx0eXBlbmFtZSBVPgp2b2lkIHRlc3RPdGhlcihVIHZhbHVlKSB7CiAgICBjb3V0IDw8ICJVbmtub3duIHR5cGU6ICIgPDwgdmFsdWUgPDwgZW5kbDsKfQoKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CmNsYXNzIFRlc3QgewpwdWJsaWM6CiAgICAKICAgIGNvbnN0ZXhwciBUZXN0KFQgdmFsdWUpIDogdmFsdWUodmFsdWUpIHt9CiAgICAKICAgIHZvaWQgdGVzdCgpIHsKICAgICAgICBpZiAoaXNfc2FtZTxULCBzdHJpbmc+Ojp2YWx1ZSkgewogICAgICAgICAgICBzdHJpbmcgJl92YWx1ZSA9ICgqcmVpbnRlcnByZXRfY2FzdDxzdHJpbmcgKj4oJnZhbHVlKSk7CiAgICAgICAgICAgIHRlc3RTdHJpbmcoX3ZhbHVlKTsKICAgICAgICB9IGVsc2UgaWYgKGlzX3NhbWU8VCwgaW50Pjo6dmFsdWUpIHsKICAgICAgICAgICAgaW50ICZfdmFsdWUgPSAoKnJlaW50ZXJwcmV0X2Nhc3Q8aW50ICo+KCZ2YWx1ZSkpOwogICAgICAgICAgICB0ZXN0SW50KF92YWx1ZSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdGVzdE90aGVyKHZhbHVlKTsKICAgICAgICB9CiAgICB9CiAgICAKcHJpdmF0ZToKICAgIAogICAgVCB2YWx1ZTsKfTsKCmludCBtYWluKCkgewogICAgVGVzdDxzdHJpbmc+KCJIZWxsbywgd29ybGQhIikudGVzdCgpOwogICAgVGVzdDxpbnQ+KDQyKS50ZXN0KCk7CiAgICBUZXN0PGZsb2F0Pig0Mi4xKS50ZXN0KCk7Cn0=