#include <iostream>
#include <typeinfo>
using namespace std;
class Str
{
const char* _s;
public:
Str( const char* s ) : _s{s} { }
//operator std::string() const { return std::string{_s}; }
operator const char*() const { return _s; }
};
std::ostream& operator<<( std::ostream& os, const Str& S )
{
return os << static_cast<std::string>(S);
}
using B = Str;
using V = const char*;
bool test( B b, V v )
{
cout << typeid(B).name() << endl << typeid(V).name() << endl;
V b_as_V{static_cast<V>(b)};
return b_as_V == v;
}
int main() {
cout << ( test( Str("ABC"), "ABC" ) ? "PASS" : "FAIL" );
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dHlwZWluZm8+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgpjbGFzcyBTdHIKewoJY29uc3QgY2hhciogX3M7CgpwdWJsaWM6CglTdHIoIGNvbnN0IGNoYXIqIHMgKSA6IF9ze3N9ICAJCQkJeyB9CgkvL29wZXJhdG9yIHN0ZDo6c3RyaW5nKCkgCQljb25zdAkJeyByZXR1cm4gc3RkOjpzdHJpbmd7X3N9OyB9CglvcGVyYXRvciBjb25zdCBjaGFyKigpIAkJCWNvbnN0IAkJeyByZXR1cm4gX3M7IH0KfTsKCnN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PCggc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgU3RyJiBTICkKewogICAgcmV0dXJuIG9zIDw8IHN0YXRpY19jYXN0PHN0ZDo6c3RyaW5nPihTKTsKfSAgCgp1c2luZyBCID0gU3RyOwp1c2luZyBWID0gY29uc3QgY2hhcio7Cgpib29sIHRlc3QoIEIgYiwgViB2ICkKewoJY291dCA8PCB0eXBlaWQoQikubmFtZSgpIDw8IGVuZGwgPDwgdHlwZWlkKFYpLm5hbWUoKSA8PCBlbmRsOwoJCglWIGJfYXNfVntzdGF0aWNfY2FzdDxWPihiKX07CgoJcmV0dXJuIGJfYXNfViA9PSB2Owp9CgppbnQgbWFpbigpIHsKCWNvdXQgPDwgKCB0ZXN0KCBTdHIoIkFCQyIpLCAiQUJDIiApID8gIlBBU1MiIDogIkZBSUwiICk7CglyZXR1cm4gMDsKfQ==