Чтобы сохранить пользовательское состояние в потоке, вам нужно использовать статическую функцию xalloc
, чтобы получить уникальный индекс, а затем либо pword
, чтобы получить указатель на этот индекс (выделенный специально для каждого потока, в котором он используется) , или iword
, чтобы получить целое число в этом индексе (выделено специально для каждого потока, в котором он используется). В вашем случае вы, вероятно, захотите pword
. Вы можете использовать указатель, возвращаемый pword
, чтобы указать на динамически выделенный объект, который хранит информацию о форматировании.
struct DateFormatter
{
// The implementation of this class (e.g. parsing the format string)
// is a seperate issue. If you need help with it, you can ask another
// question
static int xalloc_index;
};
int DateFormatter::xalloc_index = std::ios_base::xalloc();
void destroy_date_formatter(std::ios_base::event evt, std::ios_base& io, int idx)
{
if (evt == std::ios_base::erase_event) {
void*& vp = io.pword(DateFormatter::xalloc_index);
delete (DateFormatter*)(vp);
}
}
DateFormatter& get_date_formatter(std::ios_base& io) {
void*& vp = io.pword(DateFormatter::xalloc_index);
if (!vp) {
vp = new DateFormatter;
io.register_callback(destroy_date_formatter, 0);
}
return *static_cast<DateFormatter*>(vp);
}
std::ostream& operator<<(std::ostream& os, const DateFormatter& df) {
get_date_formatter(os) = df;
return os;
}
std::ostream& operator<<(std::ostream& os, const MyDate& date)
{
DateFormatter& df = get_date_formatter(os);
// format output according to df
return os;
}
int main() {
MyDate a (2000, 1, 2);
std::cout << DateFormatter("%Y/%m/%d") << a;
}
Это стандартный метод. Это ужасно, на мой взгляд. Я предпочитаю альтернативный подход, который должен передать объект даты вместе с форматированием как единым объектом. Например:
class DateFormatter
{
const MyDate* date;
std::string format_string;
DateFormatter(const MyDate& _date, std::string _format_string)
:date(&_date)
,format_string(_format_string)
{}
friend std::ostream& operator<<(std::ostream& os, const DateFormatter& df) {
// handle formatting details here
return os;
}
};
int main() {
MyDate a (2000, 1, 2);
std::cout << DateFormatter(a, "%Y/%m/%d");
}
ли, что 'должен f' быть' a'? –
Да, отредактировано в исходном коде – Stepan
Когда вы начнете и попробуйте написать его самостоятельно. – hgiesel