gpt4 book ai didi

c++ - 如何将 "add"用户自定义格式标志转为 basic_ostream?

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

我想提供一个流运算符来输出 std::chrono::time_point 作为 GMT 日期,我目前有以下内容(仅针对 ostream 进行了简化):

using datetime_t = std::chrono::system_clock::time_point;

std::ostream& operator<<(std::ostream &out, datetime_t dt) {
auto time = datetime_t::clock::to_time_t(dt);
auto under_sec =
std::chrono::duration_cast<std::chrono::milliseconds>(
dt.time_since_epoch() % std::chrono::seconds{1});
return out << std::put_time(std::gmtime(&time), "%Y-%m-%dT:%H:%M:%S")
<< "." << std::setfill('0') << std::setw(3) << under_sec.count();
}

用法:

auto time = datetime_t::clock::now();
std::cout << time;

这有效,但它迫使用户:

  • 使用硬编码格式;
  • 输出毫秒。

我想提供自定义流操纵器,允许用户修改这两个,例如对于第二个(假设命名空间 nm 包含操纵器):

std::cout << nm::us << time;

...这将打印到微秒。

我已经知道如何创建流操纵器,例如:

namespace nm {
std::ios_base& us(std::ios_base &) { /* ... */ }
}

...但我不知道如何“存储”在输出运算符中使用所需的信息。

有没有一种简单的方法可以将信息“存储”在流中(用户定义的格式标志?)以供以后的流操作使用?或者另一种获得稍微等效行为的方法?

最佳答案

正如您已经在评论中发现的那样,是的,流具有 iwordpword 存储空间。这不是世界上最容易使用的东西(设计几十年了),但可以维修。

另一种选择是为此使用已经编码的库,例如 Howard Hinnant's free, open source, datetime library :

#include "date.h"
#include <iostream>

int
main()
{
using namespace date;
using namespace std::chrono;
std::cout << format("%FT:%T", floor<microseconds>(system_clock::now())) << '\n';
}

有了这个库,输出的精度是通过调整输入的精度来控制的(即使用 time_point_castfloor)。

示例输出:

2017-07-10T:11:46:59.354321

关于c++ - 如何将 "add"用户自定义格式标志转为 basic_ostream?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45008434/

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