#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;
}