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"が最終的な結果になるはずです。私の質問は、オブジェクトに、いつ<<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

少し異なるアプローチを取り、フォーマッタオブジェクトを作成します。
フォーマッタオブジェクトは、ストリームに適用されるときにフォーマット文字の挿入を処理します。

#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 に答える
1

「独自の ostream/streambuf を作成するにはどうすればよいですか?」の回答が見つかるかもしれません。役に立った。

于 2009-05-05T02:15:37.227 に答える