C ++ 11 std :: chrono :: duration_cast <> текст используемых единиц - PullRequest
1 голос
/ 23 сентября 2019

Я пишу шаблонный класс таймера, в котором одним из типов названий шаблонов является используемое разрешение, например std::chrono::milliseconds.

Я хотел бы иметь возможность выводить результат измерения с надлежащимединицы на основе выбранного разрешения:

std::cout << std::chrono::duration_cast<Resolution>(Clock::now() - mStart).count(); 

Я хотел бы дополнить это утверждение единицами измерения;есть ли функция C ++ 11, которая может дать мне текст используемого «разрешения», то есть строку «миллисекунды».

Ответы [ 2 ]

1 голос
/ 23 сентября 2019

http://eel.is/c++draft/time.duration.io говорит, что std::cout << std::chrono::milliseconds(23) должен выводить "23ms"

@ Acorn указал в комментарии, что этот вызов был добавлен для C ++ 20.

Youможете сделать это самостоятельно:

std::chrono::milliseconds dur(23);
string s = tostring(dur.count()) + " milliseconds";
0 голосов
/ 23 сентября 2019

Вы можете использовать что-то вроде:

template <class Duration>
struct DurationSuffix;

template <class Rep>
struct DurationSuffix<std::chrono::duration<Rep, std::ratio<1>>>
{
    static const char suffix[];
};

template <class Rep>
struct DurationSuffix<std::chrono::duration<Rep, std::milli>>
{
    static const char suffix[];
};

template <class Rep>
const char DurationSuffix<std::chrono::duration<Rep, std::ratio<1>>>::suffix[] = "s";

template <class Rep>
const char DurationSuffix<std::chrono::duration<Rep, std::milli>>::suffix[] = "ms";

И затем вы будете использовать это в своем классе как:

template <class Duration>
struct C
{
    static void f()
    {
        std::cout << DurationSuffix<Duration>::suffix << "\n";
    }
};

int main()
{
    C<std::chrono::seconds>::f();
    C<std::chrono::milliseconds>::f();
    return 0;
}

Это напечатает:

s
ms
...