7

我有一个 C++ 类MyObject,我希望能够像向 osstream 一样提供这些数据(但与直接 sstream 不同,传入数据以特殊方式格式化)。我似乎无法弄清楚如何为 MyObject 重载运算符以吃给它的输入。

class MyObject {
public:
    ostringstream s;
    FEEDME
};


int main() {
     MyObject obj;
     obj.FEEDME << "Hello" << 12345;

     // I want obj.s == ":Hello::12345:"

}

我想要它,这样每一个送入的物品都被: : 包围

所以在给定的例子中,s = ":Hello::12345" 应该是最终结果。我的问题是,我怎样才能告诉对象,当有 a 时<<something,将 :: 放在某物周围。

这可能吗?

4

3 回答 3

10

试试这个:

class MyObject {
public:
    template <class T>
    MyObject &operator<<(const T &x) {
        s << ':' << x << ':';
        return *this;
    }

    std::string to_string() const { return s.str(); }

private:
    std::ostringstream s;
};

MyObject obj;
obj << "Hello" << 12345;
std::cout << obj.to_string() << std::endl;

有些东西你不能推到流中,但它应该适用于所有基础知识。

于 2009-05-05T02:16:51.280 回答
1

您可能会找到如何创建自己的 ostream/streambuf 的答案?有帮助。

于 2009-05-05T02:15:37.227 回答
1

我会采取稍微不同的方法并创建一个格式化程序对象。
然后,当将格式字符应用于流时,格式化程序对象将处理格式字符的插入。

#include <iostream>

template<typename T>
class Format
{
    public:
        Format(T const& d):m_data(d)    {}
    private:
        template<typename Y>
        friend std::ostream& operator<<(std::ostream& str,Format<Y> const& data);
        T const&    m_data;
};
template<typename T>
Format<T> make_Format(T const& data)    {return Format<T>(data);}

template<typename T>
std::ostream& operator<<(std::ostream& str,Format<T> const& data)
{
    str << ":" << data.m_data << ":";
}




int main()
{
    std::cout << make_Format("Hello") << make_Format(123);
}
于 2009-05-05T04:38:17.290 回答