C++ 用 来定义时间格式化函数strftime
,它需要一个struct tm
“分解的时间”记录。但是,C 和 C++03 语言没有提供线程安全的方式来获取这样的记录;整个程序只有一位大师struct tm
。
在 C++03 中,这或多或少是可以的,因为该语言不支持多线程;它仅支持支持多线程的平台,然后提供诸如 POSIX 之类的工具localtime_r
。
C++11 还定义了新的时间实用程序,它与非分解time_t
类型接口,这将用于重新初始化全局struct tm
. 但是获得atime_t
不是问题。
我是否遗漏了什么或者这项任务仍然需要依赖 POSIX?
编辑:这是一些解决方法代码。它保持与提供的多线程环境::localtime_r
和仅提供std::localtime
. 它也可以很容易地适用于检查其他功能,例如posix::localtime_r
or::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 ); }