I have a templated class that I'd like to change its behavior based on whether or not a version of operator<<()
has been defined for the type it's specialized for. For example,
struct HasStreamOp
{
int i, j;
friend ostream & operator<<( ostream & o, const HasStreamOp & hso )
{
o << "HasStreamOp{" << hso.i << ", " << hso.j << "}";
return o;
}
};
struct HasNoStreamOp
{
int i, j;
};
template<typename T>
struct MyClass
{
T t;
//...
// this gets called when operator<<( ostream & o, T somet ) exists
friend ostream & operator<<( ostream & o, const MyClass & mc )
{
o << "MyClass{" << mc.t << "}";
return o;
}
// this gets called when operator<<( ostream & o, T somet ) DOESN'T exists
friend ostream & operator<<( ostream & o, const MyClass & mc )
{
o << "MyClass{opaque T}";
return o;
}
};
std::cout << MyClass<HasStreamOp>{.t=HasStreamOp{.i=1,.j=2}} << std::endl;
std::cout << MyClass<HasNoStreamOp>{.t=HasNoStreamOp{.i=3,.j=4}} << std::endl;
Would print out something like...
MyClass{HasStreamOp{1,2}}
MyClass{opaque T}