Форматирование объектов в строки - PullRequest
2 голосов
/ 18 сентября 2011

Я возвращаюсь на c ++ после долгого использования Java. В Java переопределение метода toString объекта позволяет автоматически переводить объект в строку и объединять его с другими строками.

class Test {
    public static void main(String[] args) {
        System.out.println(new Test() + " There"); // prints hello there
    }

    public String toString() {
        return "Hello";
    }
}

Есть ли что-нибудь подобное, что позволило бы мне направить объект в cout?

cout << Test() << endl;

Ответы [ 2 ]

5 голосов
/ 18 сентября 2011

Эквивалентом является перегрузка operator<<:

#include <ostream>

class Test
{
  int t;
};

std::ostream& operator<<(std::ostream& os, const Test& t)
{
   os << "Hello";
   return os;
}

Затем вы должны использовать его так:

#include <iostream>

int main()
{
  std::cout << Test() << " There" << std::endl;
}

См. Код в действии: http://codepad.org/pH1CVYPR

2 голосов
/ 18 сентября 2011

Распространенной идиомой является создание перегрузки operator<<, которая принимает выходной поток в качестве левого операнда.

#include <iostream>

struct Point
{
    double x;
    double y;
    Point(double X, double Y)
      : x(X), y(Y)
    {}
};

std::ostream & operator<<(std::ostream & Stream, const Point & Obj)
{
    // Here you can do whatever you want with your stream (Stream)
    // and the object being written into it (Obj)
    // For our point we can just print its coordinates
    Stream<<"{"<<Obj.x<<", "<<Obj.y<<"}";
    return Stream; // return the stream to allow chained writes
}

int main()
{
    Point APoint(10.4, 5.6);
    std::cout<<APoint<<std::endl; // this will print {10.4, 5.6}
    return 0;
}

Если вы хотите поддерживать потоки с другими типами символов (например, wchar_t) / параметры шаблона для потоков, которые вы должны записать для различных типов потоков, которые вы хотите поддерживать, должны создавать различные перегрузки, или, если ваш код (более или менее) независим от таких типов, вы можете просто написать шаблон operator<<.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...