C ++クラスをカスタムostream、sstreamのように動作させる
-
03-07-2019 - |
質問
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 = <!> quot;:Hello :: 12345 <!> quot;最終的な結果でなければなりません。私の質問は、<<something
のときにオブジェクトの周りに::を置くことをオブジェクトに伝える方法です。
これは可能ですか?
解決
これを試してください:
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;
ストリームに押し込めない特定のものがありますが、すべての基本で機能するはずです。
他のヒント
私は少し異なるアプローチを取り、フォーマッターオブジェクトを作成します。
#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);
}
所属していません StackOverflow