Re: Generic ostream operator<<?
Gerhard Fiedler=E6=96=BC 2012=E5=B9=B46=E6=9C=8820=E6=97=A5=E6=98=9F=E6=9C=
=9F=E4=B8=89UTC+8=E4=B8=8A=E5=8D=883=E6=99=8242=E5=88=8652=E7=A7'=E5=AF=
=AB=E9=81=93=EF=BC=9A
Victor Bazarov wrote:
On 6/19/2012 3:30 PM, Gerhard Fiedler wrote:
I want to be able to stream custom classes to ostreams like this:
MyClass foo;
myStream<< foo;
AIUI, this requires an operator<<() with this signature:
std::ostream&operator<<( std::ostream&str, MyClass const&printable );
In order to avoid creating such a function for every class, I tried a
template like this:
template< class Printable>
std::ostream&operator<<( std::ostream&stream,
Printable const&printable )
{
printable.print( stream );
return stream;
}
(All the classes in question have a public member function "void print=
(
std::ostream&stream )".)
However, with this I get tons of errors like "'operator<<' is
ambiguous".
Is there a way to define this template function so that it is only
instantiated for classes that implement this print() function? (I coul=
d
make the name such that it is very unlikely that any other class has
such a name.)
Or is there another way to avoid having to define such a global
operator<< for every class with ostream support?
Have you considered using polymorphism at all, or is it out of fashion=
already?
Thank you for your response. In fact I didn't consider it at first,
reconsidered it after reading your post, and threw it out again :)
This is meant to work for an indeterminate number of classes of a bigger
system, some of which are not polymorphic at all for various reasons. I
don't want to put this constraint on all the classes that potentially
may want to use this interface.
If there was a way without polymorphism, I would prefer this.
Gerhard
Gerhard Fiedler=E6=96=BC 2012=E5=B9=B46=E6=9C=8820=E6=97=A5=E6=98=9F=E6=9C=
=9F=E4=B8=89UTC+8=E4=B8=8A=E5=8D=883=E6=99=8242=E5=88=8652=E7=A7'=E5=AF=
=AB=E9=81=93=EF=BC=9A
Victor Bazarov wrote:
On 6/19/2012 3:30 PM, Gerhard Fiedler wrote:
I want to be able to stream custom classes to ostreams like this:
MyClass foo;
myStream<< foo;
AIUI, this requires an operator<<() with this signature:
std::ostream&operator<<( std::ostream&str, MyClass const&printable );
In order to avoid creating such a function for every class, I tried a
template like this:
template< class Printable>
std::ostream&operator<<( std::ostream&stream,
Printable const&printable )
{
printable.print( stream );
return stream;
}
(All the classes in question have a public member function "void print=
(
std::ostream&stream )".)
However, with this I get tons of errors like "'operator<<' is
ambiguous".
Is there a way to define this template function so that it is only
instantiated for classes that implement this print() function? (I coul=
d
make the name such that it is very unlikely that any other class has
such a name.)
Or is there another way to avoid having to define such a global
operator<< for every class with ostream support?
Have you considered using polymorphism at all, or is it out of fashion=
already?
Thank you for your response. In fact I didn't consider it at first,
reconsidered it after reading your post, and threw it out again :)
This is meant to work for an indeterminate number of classes of a bigger
system, some of which are not polymorphic at all for various reasons. I
don't want to put this constraint on all the classes that potentially
may want to use this interface.
If there was a way without polymorphism, I would prefer this.
Gerhard
Lets face polymorphism seriously for a compiled program in the runtime.
V-tables of functors are necessary for objeccts with actions
in derived classes to use methods in their base classes propperly.