Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

std::chrono::duration_cast<> - konwersja na typ o mniejszej precyzji VS2013

Ostatnio zmodyfikowano 2016-01-18 02:06
Autor Wiadomość
carlosmay
Temat założony przez niniejszego użytkownika
std::chrono::duration_cast<> - konwersja na typ o mniejszej precyzji VS2013
» 2016-01-17 16:37:36
Przykład:
C/C++
#include <ratio>
#include <chrono>
#include <iostream>

int main()
{
    using namespace std::chrono;
   
    milliseconds ms( 7255042 );
   
    // podziel na godz, min, sec i milisec
    hours hh = duration_cast < hours >( ms ); // tutaj jawna konwersja dziala prawidlowo
    minutes mm = duration_cast < minutes >( ms % hours( 1 ) ); // tutaj juz nie
    seconds ss = duration_cast < seconds >( ms % minutes( 1 ) ); // tutaj tez
    milliseconds msec = duration_cast < milliseconds >( ms % seconds( 1 ) ); // tutaj tez
}

Wróciłem ostatnio do VS2013, bo następca robi mi dużo problemów.
Do rzeczy. Kod powyżej skompilowany na VS2015 działa OK, natomiast na VS2013 wypisuje taki błędy.

error C2446: ':' : no conversion from 'std::chrono::duration<int,std::ratio<0x0e10,0x01>>' to '__int64'
c:\program files (x86)\microsoft visual studio 12.0\vc\include\type_traits 1446 1 ConsoleApplication1
error C2784: 'enable_if<std::chrono::_Is_duration<_Ty>::value,_To>::type std::chrono::duration_cast(const std::chrono::duration<_Rep,_Period> &)' :
could not deduce template argument for 'const std::chrono::duration<_Rep,_Period> &' from '__int64'
c:\users\...\projects\consoleapplication1\consoleapplication1\source.cpp 72 1 ConsoleApplication1

Nie wiem jak inaczej skonkretyzować typ dla std::chrono::duration_cast<>, aby było możliwe skonwertowanie.
P-143644
carlosmay
Temat założony przez niniejszego użytkownika
» 2016-01-17 21:14:21
Zrobiłem to z pomocą stałych, choć wolałbym móc wykorzystać typy udostępnione w bibliotece <chrono>.
C/C++
#include <iostream>
#include <chrono>
#include <ratio>
#include <iomanip>

const long long MSEC_PER_SEC = 1000;
const long long MSEC_PER_MIN = 60 * MSEC_PER_SEC;
const long long MSEC_PER_HOUR = 60 * MSEC_PER_MIN;
const long long MSEC_PER_DAY = 24 * MSEC_PER_HOUR;

void showFormatTime(
std::chrono::hours hr,
std::chrono::minutes mn,
std::chrono::seconds sc,
std::chrono::milliseconds msc )
{
    cout << "Sformatowany czas: "
    << std::setfill( '0' )
    << std::setw( 2 ) << hr.count() << ":"
    << std::setw( 2 ) << mn.count() << ":"
    << std::setw( 2 ) << sc.count() << ":"
    << std::setw( 2 ) << msc.count() << endl;
}

int main()
{
    using namespace std::chrono;
   
    milliseconds ms( 7255042 );
   
    // podziel na godz, min, sec i milisec
    hours hh = duration_cast < hours >( ms );
    minutes mm = duration_cast < minutes >( ms % MSEC_PER_HOUR );
    seconds ss = duration_cast < seconds >( ms % MSEC_PER_MIN );
    milliseconds msec = duration_cast < milliseconds >( ms % MSEC_PER_SEC );
    showFormatTime( hh, mm, ss, msec );
}

Nie rozumiem czemu (ms % MSEC_PER_HOUR) działa, a (ms % hours( 1 )) nie.
P-143692
Monika90
» 2016-01-17 23:19:08
Moim zdaniem powinieneś podać prostszy przykład, choć to pewnie i tak jest bug w implementacji

czy ten kod się kompiluje?
C/C++
#include <chrono>
int main()
{
    using namespace std::chrono;
    ( milliseconds( 123 ) % hours( 1 ) ).count();
}

Zresztą nieważne, to jest znany bug:
https://connect.microsoft.com​/VisualStudio/feedback/details​/794649​/non-conforming-return-value-for-std-chrono-duration-operator
P-143709
carlosmay
Temat założony przez niniejszego użytkownika
» 2016-01-18 02:06:11
czy ten kod się kompiluje?
Niestety nie. Wykrzykuje
error C2228: left of '.count' must have class/struct/union
.

Moim zdaniem powinieneś podać prostszy przykład
Chciałem, żeby służył też innym.
Przyjmuję sugestię do wiadomości.

Dziękuję.
P-143720
« 1 »
  Strona 1 z 1