C ++は、 「分解された時間」レコードstrftime
を必要とするという観点から時間フォーマット関数を定義します。struct tm
ただし、CおよびC ++ 03言語は、そのようなレコードを取得するためのスレッドセーフな方法を提供していません。struct tm
プログラム全体でマスターは1つだけです。
C ++ 03では、言語がマルチスレッドをサポートしていなかったため、これは多かれ少なかれ問題ありませんでした。マルチスレッドをサポートするプラットフォームをサポートするだけで、POSIXなどの機能を提供していlocaltime_r
ました。
C ++ 11は、グローバルを再初期化するために使用される、ブレークダウンされtime_t
ていないタイプとインターフェイスする新しい時間ユーティリティも定義します。しかし、を取得することは問題ではありません。struct tm
time_t
私は何かが足りないのですか、それともこのタスクはまだPOSIXに依存する必要がありますか?
編集:ここにいくつかの回避策のコードがあります。::localtime_r
を提供するマルチスレッド環境およびのみを提供するシングルスレッド環境との互換性を維持しますstd::localtime
。posix::localtime_r
または、::localtime_s
またはwhat-have-youなどの他の機能もチェックするように簡単に適合させることができます。
namespace query {
char localtime_r( ... );
struct has_localtime_r
{ enum { value = sizeof localtime_r( std::declval< std::time_t * >(), std::declval< std::tm * >() )
== sizeof( std::tm * ) }; };
template< bool available > struct safest_localtime {
static std::tm *call( std::time_t const *t, std::tm *r )
{ return localtime_r( t, r ); }
};
template<> struct safest_localtime< false > {
static std::tm *call( std::time_t const *t, std::tm *r )
{ return std::localtime( t ); }
};
}
std::tm *localtime( std::time_t const *t, std::tm *r )
{ return query::safest_localtime< query::has_localtime_r::value >().call( t, r ); }