Как преобразовать код типа без изменения существующих типов POD

0

В приложениях 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;
  • 1
    boost::lexical_cast<FILETIME>(stNow) образом boost::lexical_cast<FILETIME>(stNow) более удобен, чем SystemTimeToFileTime(stNow) ?
  • 0
    @n.m.Вы должны написать больше кода / строки, если SystemTimeToFileTime , и невозможно сделать FIMETILE результатом SystemTimeToFileTime const.
Показать ещё 5 комментариев
Теги:
boost

1 ответ

0

Один из способов - создать класс для хранения времени, с преобразованиями и из 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; }
};
  • 0
    Спасибо, но я создал это раньше: p

Ещё вопросы

Сообщество Overcoder
Наверх
Меню