Re: Generic ostream operator<<?
On 6/24/2012 11:52 PM, Gerhard Fiedler wrote:
#include<iostream>
#include<type_traits>
template<typename T>
class is_printable
{
typedef char yes[1];
typedef char no[2];
template<typename C> static yes& test( decltype(&C::print) );
template<typename C> static no& test(...);
public:
static const bool value = (sizeof(test<T>(0)) == sizeof(yes));
};
template< class Printable>
typename
std::enable_if<is_printable<Printable>::value,std::ostream&>::type
operator<<( std::ostream&stream, Printable const&printable )
{
printable.print( stream );
return stream;
}
class MyClass
{
public:
MyClass( char const *val ) : str( val ) {}
void print( std::ostream&stream ) const { stream<< str; }
private:
char const *str;
};
int main(int argc, char* argv[])
{
std::cout<< MyClass( "bar" )<< std::endl;
}
template<typename T>
void GTestStreamToHelper(std::ostream* os, const T& val) {
*os<< val;
}
int main(int argc, char* argv[])
{
MyClass foo( "bar" );
std::cout<< "test "<< foo<< std::endl;
std::string const gtest( "gtest" );
GTestStreamToHelper(&std::cout, gtest );
std::cout<< std::endl;
}
This:
---------------------------------------------->8 cut here
#include <iostream>
#include <type_traits>
#include <string>
template <typename T>
class is_printable
{
typedef char yes[1];
typedef char no[2];
template <typename C> static yes& test( decltype(&C::print) );
template <typename C> static no& test(...);
public:
static const bool value = (sizeof(test<T>(0)) == sizeof(yes));
};
template<> class is_printable<std::string> {
public: static const bool value = false;
};
template < class Printable >
typename
std::enable_if<is_printable<Printable>::value,std::ostream&>::type
operator<<( std::ostream &stream, Printable const &printable )
{
printable.print( stream );
return stream;
}
class MyClass
{
public:
MyClass( char const *val ) : str( val ) {}
void print( std::ostream &stream ) const { stream << str; }
private:
char const *str;
};
template <typename T>
void GTestStreamToHelper(std::ostream* os, const T& val) {
*os << val;
}
int main()
{
MyClass foo( "bar" );
std::cout << "test " << foo << std::endl;
std::string const gtest( "gtest" );
GTestStreamToHelper( &std::cout, gtest );
std::cout << std::endl;
}
---------------------------------------------->8 cut here
compiled for me fine with Visual C++ 2010. And the output was
test bar
gtest
Does that solve your problem?
V
--
I do not respond to top-posted replies, please don't ask