هل لديك عمل 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:"
}
وأريد ذلك حتى يتم إحاطة كل بند الطعام في كتبها:
": مرحبا :: 12345" يجب أن تكون النتيجة النهائية لذلك في المثال المذكور، ق =. ما سؤالي هو: كيف يمكنني معرفة ما الكائن الذي عند أي وقت مضى <<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;
وهناك بعض الأشياء التي لن تكون قادرة على الحسم في تيار، ولكن يجب أن تعمل لجميع الأساسيات.
نصائح أخرى
ويمكنك العثور على إجابات ل كيف يمكنني إنشاء بلدي ostream بك / streambuf ؟ مفيدة .
وأود أن أنتهز نهجا مختلفا قليلا وإنشاء كائن formater.
إن الكائن formater ثم التعامل مع ادخال حرف شكل عندما يتم تطبيقه على تيار.
#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);
}