私はGMT日として出力std::chrono::time_point
にストリーム演算子を提供したい、私は現在、(のみostream
ために簡略化)次き:basic_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;
これは動作しますが、それは強制的に
- ハードコードされた形式を使用してください。
- 出力ミリ秒。
私はカスタムストリームマニピュレータを提供したいと思います。カスタムマニピュレータを使用して、これらの両方を変更することができます。
std::cout << nm::us << time;
...それはマイクロ秒までの印刷になります秒(マニピュレータを含む名前空間nm
を想定)。
私はすでに
namespace nm {
std::ios_base& us(std::ios_base &) { /* ... */ }
}
:例えば、ストリームマニピュレータを作成する方法を知っている...しかし、私はどのように「ストア」への出力オペレータで使用するために必要な情報を知りません。
後でストリーム操作で使用するために情報をストリームに格納する単純な方法はありますか(ユーザー定義のフォーマットフラグ?)?やや同等の動作を得る別の方法?
この場合、あなたが引数として時間を要する「マニピュレータ」をお勧めします。 –
@Someprogrammerdudeこれはオプションになりますが、 'std :: cout << nm :: us(time);'を書く必要はありません(もしこれが意味するのであれば、あなたは何を話しているのか分かりません約 ;))。 – Holt
はい、それは私が意味するものです。それは例えば何ですか? 'put_time'は、ストリームオブジェクトを変更しない他のマニピュレータを含みます。また、(標準)ストリームオブジェクトにカスタムデータやユーザーデータを追加する方法もありません。 –