سؤال

ولدي 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;

وهناك بعض الأشياء التي لن تكون قادرة على الحسم في تيار، ولكن يجب أن تعمل لجميع الأساسيات.

نصائح أخرى

وأود أن أنتهز نهجا مختلفا قليلا وإنشاء كائن 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);
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top