Question

J'ai une classe C ++ MyObject et je veux pouvoir transmettre ces données comme je le ferais à un osstream (mais contrairement à un sstream direct, les données entrantes doivent être formatées de manière spéciale). Je n'arrive pas à comprendre comment surcharger un opérateur pour que MyObject mange les entrées qui lui sont données.

class MyObject {
public:
    ostringstream s;
    FEEDME
};


int main() {
     MyObject obj;
     obj.FEEDME << "Hello" << 12345;

     // I want obj.s == ":Hello::12345:"

}

Je le veux pour que chaque article alimenté soit entouré par::

Donc, dans l'exemple donné, s = " Hello: 12345 " devrait être le résultat final. Quelle est ma question, comment puis-je dire à l'objet que chaque fois qu'un <<something, mettez:: autour du quelque chose.

Est-ce possible?

Était-ce utile?

La solution

essayez ceci:

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;

Il y a certaines choses que vous ne pourrez pas insérer dans le flux, mais cela devrait fonctionner pour toutes les bases.

Autres conseils

Vous pouvez trouver les réponses à Comment créer mon propre ostream / streambuf ? utile.

Je prendrais une approche légèrement différente et créerais un objet de formatage. L’objet formater devrait alors gérer l’insertion de caractères de format lorsqu’il est appliqué à un flux.

#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);
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top