В приложениях Windows мы часто используем SYSTEMTIME и FILETIME. Это очень раздражает и многословно, чтобы преобразовать их по функциям FileTimeToSystemTime и SystemTimeToFileTime. Например,
// get the time of now.
SYSTEMTIME stNow;
GetLocalTime(&stNow);
// get the time of 100 seconds later from now.
FILETIME ftNow;
SystemTimeToFileTime(&stNow, &ftNow);
const FILETIME ftLater = get_later_time(ftNow, 100);
// print
SYSTEMTIME stLater;
FileTimeToSystemTime(&ftLater, &stLater);
print_time(stLater);
Для более удобного и чистого кодирования мы можем написать некоторые функции преобразования.
FILETIME to_filetime(const SYSTEMTIME &st)
{
FILETIME ft;
SystemTimeToFileTime(&st, &ft);
return ft;
}
SYSTEMTIME to_systemtime(const FILETIME &ft)
{
SYSTEMTIME st;
FileTimeToSystemTime(&ft, &st);
return st;
}
Досадные коды могут быть переписаны очистителем.
// get the time of now.
SYSTEMTIME stNow;
GetLocalTime(&stNow);
// print the time of 100 seconds later from now
print_time(to_systemtime(get_later_time(to_filetime(stNow), 100)));
Мой вопрос - есть ли другие способы сделать их конвертируемыми? Например, как я могу расширить преобразование в boost::lexical_cast
,
FILETIME ftNow = boost::lexical_cast<FILETIME>(stNow);
SYSTEMTIME stNow2 = boost::lexical_cast<SYSTEMTIME>(ftNow);
Или возможно (я думаю, нет) перегрузить оператор преобразования?
FILETIME ftNow = stNow;
SYSTEMTIME stNow2 = ftNow;
Один из способов - создать класс для хранения времени, с преобразованиями и из FILETIME
и SYSTEMTIME
, и использовать его исключительно. Вы можете основать его на объединении. FILETIME
и SYSTEMTIME
. Следующие непроверены.
class WinTime {
bool isSystem;
union {
SYSTEMTIME sys;
FILETIME fil;
};
public:
// Implementing these is trivial
WinTime (const FILETIME&);
WinTime (const SYSTEMTIME&);
WinTime (const WinTime&);
operator FILETIME() const;
operator SYSTEMTIME() const;
// add these if you want to use it in WinApi
WinTime(){}
FILETIME* asFiletime() { isSystem = false; return &fil; }
SYSTEMTIME* asSystemtime() { isSystem = true; return &sys; }
};
boost::lexical_cast<FILETIME>(stNow)
образомboost::lexical_cast<FILETIME>(stNow)
более удобен, чемSystemTimeToFileTime(stNow)
?SystemTimeToFileTime
, и невозможно сделатьFIMETILE
результатомSystemTimeToFileTime
const.