gpt4 book ai didi

c++ - 重载运算符<<

转载 作者:搜寻专家 更新时间:2023-10-31 01:35:50 28 4
gpt4 key购买 nike

我想重载 operator<<像这样:

ostringstream oss;
MyDate a(2000, 1, 2);
oss << dateFormat("%Y/%m/%d") << a;
assert(oss.str() == "2000-01-02");

所以日期在a将被格式化为特定格式。如何实现?

最佳答案

为了在流中存储自定义状态,您需要使用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");
}

关于c++ - 重载运算符<<,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36671493/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com