Переопределить операторы вывода для basic_ostream
От: NotImplemented США github.com/NotImplemented
Дата: 03.11.15 11:48
Оценка:
Хочется добиться быстрого вывода для кастомного типа.
Пусть имеется следующий класс:
class Date {

    int year, month, day;

public:
    Date(int year, int month, int day) : year(year), month(month), day(day) {}

    friend std::ostream &operator<<(std::ostream &os, const Date &d) 
    {
        return os << d.year << '-' << d.month << '-' << d.day;
    }
};


И хочется, чтобы следующая конструкция работала, не используя iostream:
int main()
{
    std::string s = fmt::format("The date is {}", Date(2012, 12, 9));
}


Пытаюсь выкрутиться так:
template<class Elem, class Traits>
class BasicStreamBuf : public std::basic_ostream<Elem, Traits>
{
public:
    BasicStreamBuf() : std::basic_ostream<Elem, Traits>(0, false)
    {
    }

    // Cannot be called.
    BasicStreamBuf<Elem, Traits> & operator << (int value)
    {
        //writer_.write_int(value);
        return *this;
    }
};

namespace fmt
{
    template<class T>
    std::string format(const std::string& fmt, const T& t)
    {
        BasicStreamBuf<Char, std::char_traits<Char> > os;
        os << t;

        return format(fmt, os.str());
    }
}

Все равно вызывается basic_ostream::operator<<(int).

Допустим, тип можно модифицировать, добавив в него fmt::ostream& operator<<(fmt::ostream&, T)
Каким образом вызвать такой метод при его наличии?
basic_ostream operator<<
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.