0

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}
Ted Middleton
  • 6,859
  • 10
  • 51
  • 71

0 Answers0