とくにあぶなくないRiSKのブログ

危ないRiSKのブログだったかもしれない。本当はRiSKだけどググラビリティとか取得できるIDの都合でsscriskも使ったり。

C標準ライブラリとBoostが出会ったら

どうなるのか?というネタに挑戦。
今回は の struct tm あたりで遊んでみます。Boost を使うのでもちろんコードはC++です。
tm を lexical_cast して string を得られるように拡張してみます。

// ライブラリ
#include<iosfwd>
#include<ctime>
#include<string>

std::ostream& operator<<(std::ostream& os, std::tm const& t)
{
 return os << std::asctime(&t);
}

// クライアント
#include<ctime>
#include<string>
#include<iostream>
#include<boost/lexical_cast.hpp>
int main()
{
 using namespace std;
 using namespace boost;
 time_t const t = time(0);
 if(t == static_cast<time_t>(-1))return 1;
 string const time_str = lexical_cast<string>(*localtime(&t));
 cout << time_str << endl;
}

実行結果:

Fri Sep 24 17:02:51 2010

本当は time_t を string にしたかったのですが,time_t は整数型の typedef なのでうまくオーバーロードできず断念しました。あと,operator<< を namespace sscrisk で囲みたかったのですが,謎の(私には理解できない)エラーがたくさん出たのでやめました。
なんか,このコードを見ると time_t を optional 化できそうですね。それは次回(に続くの?)