Pregunta

tengo una clase de c++ MyObject y quiero poder enviar estos datos como lo haría con un osstream (pero a diferencia de un sstream directo, los datos entrantes deben formatearse de una manera especial).Parece que no puedo entender cómo sobrecargar un operador para que MyObject consuma la entrada que se le proporciona.

class MyObject {
public:
    ostringstream s;
    FEEDME
};


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

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

}

Lo quiero para que cada elemento introducido esté rodeado por::

Entonces, en el ejemplo dado, s = ":Hello::12345" debería ser el resultado final.Cuál es mi pregunta, ¿cómo puedo decirle al objeto que cuando alguna vez <<something, poner ::alrededor de algo.

es posible?

¿Fue útil?

Solución

prueba esto:

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;

Hay ciertas cosas que no podrá introducir en la transmisión, pero debería funcionar para todos los aspectos básicos.

Otros consejos

Puede encontrar las respuestas para ¿Cómo creo mi propio ostream / streambuf? ? útil.

Adoptaría un enfoque ligeramente diferente y crearía un objeto formateador. El objeto formateador manejaría la inserción del carácter de formato cuando se aplica a una secuencia.

#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);
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top