すべての挿入操作を同封の ostringstream インスタンスに委譲する ostringstream インスタンスのシン ラッパーを作成しようとしています。アイデアは、カスケード挿入操作を行うときに型を保持することです。通常、カスケード挿入操作の結果の型は ostream& であり、元の型は失われます。さらに処理するためにメソッドに渡すことができるようにしたいので、式の型を維持したいと思います。挿入された文字列データを取得するために、基になる ostringstream にアクセスしたいと考えています。
次のようなことができて、式の結果が LgStream になるようにしたいと思います。
LgStream() << 26 << " a plain string " << std::string("a std string") << someObjWithItsOwnInsertionOperator;
そのため、基本的な型には operator<<() を定義し、その他すべてのキャッチオールとしてテンプレート メソッドを定義しました。
class LgStream
{
public:
ostringstream m_oss;
string str() {return m_oss.str();}
LgStream &operator<<(int x) {m_oss << x; return *this;}
LgStream &operator<<(long x) {m_oss << x; return *this;}
LgStream &operator<<(char x) {m_oss << x; return *this;}
LgStream &operator<<(bool x) {m_oss << (x ? 'T':'F'); return *this;}
LgStream &operator<<(double x) {m_oss << x; return *this;}
template <typename T>
LgStream &operator<<(const T &x) {m_oss << x; return *this;}
template <typename T>
LgStream &operator<<(const T x) {m_oss << x; return *this;}
};
私はそれを正しく持っておらず、「あいまいな過負荷」エラーが発生しています。例えば:
LgStream() << "This is a plain string";
error: ambiguous overload for 'operator<<' in 'LgStream() << "This is a plain string"'
note: candidates are:
note: LgStream& LgStream::operator<<(int) <near match>
note: no known conversion for argument 1 from 'const char [23]' to 'int'
note: LgStream& LgStream::operator<<(long int) <near match>
note: no known conversion for argument 1 from 'const char [23]' to 'long int'
note: LgStream& LgStream::operator<<(char) <near match>
note: no known conversion for argument 1 from 'const char [23]' to 'char'
note: LgStream& LgStream::operator<<(bool)
note: LgStream& LgStream::operator<<(std::string)
note: LgStream& LgStream::operator<<(const T&) [with T = char [23], LgStream = LgStream]
note: LgStream& LgStream::operator<<(T) [with T = const char*, LgStream = LgStream]
いずれかの構文で、または間違ったアプローチを取っている場合は、どんな助けでも感謝します。