#include <string>
class C
{
std::string p_String = "";
bool p_Bool = false;
int p_Int = 0;
public:
template <typename T>
operator T() const
{
if constexpr (std::is_same<T, bool>::value)
return p_Bool;
if constexpr (std::is_same<T, std::string>::value)
return p_String;
if constexpr (std::is_same<T, int>::value)
return p_Int;
}
};
int main()
{
C instance;
bool b = static_cast<bool>(instance);
int i = static_cast<int>(instance);
std::string s = static_cast<std::string const&>(instance);
//std::string s = static_cast<std::string>(instance);
}
I2luY2x1ZGUgPHN0cmluZz4KCmNsYXNzIEMKewogICAgc3RkOjpzdHJpbmcgcF9TdHJpbmcgPSAiIjsKICAgIGJvb2wgcF9Cb29sID0gZmFsc2U7CiAgICBpbnQgcF9JbnQgPSAwOwpwdWJsaWM6CiAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KICAgIG9wZXJhdG9yIFQoKSBjb25zdAogICAgewogICAgICAgIGlmIGNvbnN0ZXhwciAoc3RkOjppc19zYW1lPFQsIGJvb2w+Ojp2YWx1ZSkKICAgICAgICAgICAgcmV0dXJuIHBfQm9vbDsKICAgICAgICBpZiBjb25zdGV4cHIgKHN0ZDo6aXNfc2FtZTxULCBzdGQ6OnN0cmluZz46OnZhbHVlKQogICAgICAgICAgICByZXR1cm4gcF9TdHJpbmc7CiAgICAgICAgaWYgY29uc3RleHByIChzdGQ6OmlzX3NhbWU8VCwgaW50Pjo6dmFsdWUpCiAgICAgICAgICAgIHJldHVybiBwX0ludDsKICAgIH0KfTsKCmludCBtYWluKCkKewogICAgQyBpbnN0YW5jZTsKICAgIGJvb2wgYiA9IHN0YXRpY19jYXN0PGJvb2w+KGluc3RhbmNlKTsKICAgIGludCBpID0gc3RhdGljX2Nhc3Q8aW50PihpbnN0YW5jZSk7CiAgICBzdGQ6OnN0cmluZyBzID0gc3RhdGljX2Nhc3Q8c3RkOjpzdHJpbmcgY29uc3QmPihpbnN0YW5jZSk7CiAgICAvL3N0ZDo6c3RyaW5nIHMgPSBzdGF0aWNfY2FzdDxzdGQ6OnN0cmluZz4oaW5zdGFuY2UpOwp9Cg==