struct my_type {
void set_x(int xx);
void set_y(double yy);
my_type(int xx, double yy)
: x(xx)
, y(yy)
{}
friend std::ostream& operator<<(std::ostream& os, my_type const&);
private:
int x;
double y;
};
std::ostream& operator<<(std::ostream& os, my_type const& m)
{
return os << m.x << ' ' << m.y;
}
my_type m(10, 20.0);
std::stringstream ss;
std::string image = (ss << m).str(); // WRONG!
operator<<
返回的类型已经变成没有 str()
取得字符串函数的基类 std::ostream&
了. 看起来要什么流类型进来什么流类型出才行, 比如struct my_type {
void set_x(int xx);
void set_y(double yy);
my_type(int xx, double yy)
: x(xx)
, y(yy)
{}
friend template<typename _OS>
_OS& operator<<(_OS& os, my_type const&); // WRONG
private:
int x;
double y;
};
template <typename _OS>
_OS& operator<<(_OS& os, my_type const& m)
{
os << m.x << ' ' << m.y;
return os;
}
那要不先把
my_type
对象弄成字符串了, 再把字符串输出好了struct my_type {
void set_x(int xx);
void set_y(double yy);
my_type(int xx, double yy)
: x(xx)
, y(yy)
{}
std::string str() const
{
std::stringstream ss;
ss << m.x << ' ' << m.y;
return ss.str();
}
private:
int x;
double y;
};
template <typename _OS>
_OS& operator<<(_OS& os, my_type const& m) // ACTUALLY NOT NEEDED ANY MORE
{
os << m.str();
return os;
}
一个可能的方案是, 为每个自定义类型实现
str()
成员函数 (有必要的还可以虚一下), 然后全局声明一个template <typename _OS, typename _T>
_OS& operator<<(_OS& os, _T const& t)
{
os << t.str();
return os;
}