Pergunta

Eu tenho um C ++ MyObject classe e eu quero ser capaz de alimentar esses dados como eu faria a um osstream (mas ao contrário de um sstream direta, têm os dados de entrada ser formatado de modo especial). Eu não consigo descobrir como sobrecarregar um operador para MyObject para comer entrada dada a ele.

class MyObject {
public:
    ostringstream s;
    FEEDME
};


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

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

}

Eu quero isso de modo cada item alimentado em estar rodeado por::

Assim, no exemplo dado, s = ": Olá :: 12345" deve ser o resultado final. O que a minha pergunta é, como posso saber o objeto que sempre que um <<something, coloque:: em torno da coisa.

Isso é possível?

Foi útil?

Solução

tente o seguinte:

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;

Há certas coisas que você não será capaz de empurrar para a corrente, mas deve funcionar para todos os fundamentos.

Outras dicas

Você pode encontrar as respostas para Como posso criar meu próprio ostream / streambuf ? útil.

Gostaria de ter uma abordagem um pouco diferente e criar um objeto formater.
O objeto formater, então, lidar com a inserção de caracteres formato quando é aplicado a um córrego.

#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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top