Хочется добиться быстрого вывода для кастомного типа.
Пусть имеется следующий класс:
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)
Каким образом вызвать такой метод при его наличии?