C++ Stringstream-将对象转换为字符串

C++ Stringstream-将对象转换为字符串,c++,stringstream,C++,Stringstream,我有一个复杂的对象,我希望能够通过在与类相同的命名空间中定义运算符重载,将其传递到std::ostringstream: template<typename charT, typename traits> std::basic_ostream<charT, traits> & operator<< (std::basic_ostream<charT, traits> &lhs, Your_class const &rhs)

我有一个复杂的对象,我希望能够通过在与类相同的命名空间中定义运算符重载,将其传递到std::ostringstream:

template<typename charT, typename traits>
std::basic_ostream<charT, traits> &
operator<< (std::basic_ostream<charT, traits> &lhs, Your_class const &rhs) {
    return lhs << rhs.id() << ' ' << rhs.name();
}
如果输出函数需要访问类的私有成员,则可以将其定义为友元函数:

class Your_class {
    int id;
    string name;

    template<typename charT, typename traits>
    friend std::basic_ostream<charT, traits> &
    operator<< (std::basic_ostream<charT, traits> &lhs, Your_class const &rhs) {
        return lhs << rhs.id << ' ' << rhs.name;
    }
};

请注意,这不会产生成员函数,它只是一种方便的方法,可以立即声明和定义友元函数。

在与类相同的命名空间中定义运算符重载:

template<typename charT, typename traits>
std::basic_ostream<charT, traits> &
operator<< (std::basic_ostream<charT, traits> &lhs, Your_class const &rhs) {
    return lhs << rhs.id() << ' ' << rhs.name();
}
如果输出函数需要访问类的私有成员,则可以将其定义为友元函数:

class Your_class {
    int id;
    string name;

    template<typename charT, typename traits>
    friend std::basic_ostream<charT, traits> &
    operator<< (std::basic_ostream<charT, traits> &lhs, Your_class const &rhs) {
        return lhs << rhs.id << ' ' << rhs.name;
    }
};

请注意,这不会产生成员函数,它只是一种方便的方法,可以立即声明和定义友元函数。

是,只需在什么上下文中重载唯一id?在运行进程的实例中,您可以使用它的内存地址。它们是类项目的学生对象。每个学生对象都有一个名称、id、地址和电话号码,并且都是从txt文件中生成的。@MartinBeckett-重载@mouseas-用于您的类。每个类都有一个函数,当您请求“Yes”时会调用该函数,只是在什么上下文中重载唯一id?在运行进程的实例中,您可以使用它的内存地址。它们是类项目的学生对象。每个学生对象都有一个名称、id、地址和电话号码,并且都是从txt文件中生成的。@MartinBeckett-重载@mouseas-用于您的类。每个类都有一个函数,当您请求“traits模板参数有一个默认值,因此可以跳过它。”traits模板参数有一个默认值,因此可以跳过它。