Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

How can I call this template function correctly in main() in cpp which uses chrono library to convert a number to a date?

How can I call this template function correctly in main() in cpp which uses chrono library to convert a number to a date?

 #include <iostream>
 #include <chrono>
 #include <tuple>
 
 //using namespace std;
 // Returns year/month/day triple in civil calendar
 // Preconditions:  z is number of days since 1970-01-01 and is in the range:
 //                   [numeric_limits<Int>::min(), numeric_limits<Int>::max()-719468].
 template <class Int>
 constexpr
 std::tuple<Int, unsigned, unsigned>
 civil_from_days(Int z) noexcept
 {
     static_assert(std::numeric_limits<unsigned>::digits >= 18,
              "This algorithm has not been ported to a 16 bit unsigned integer");
     static_assert(std::numeric_limits<Int>::digits >= 20,
              "This algorithm has not been ported to a 16 bit signed integer");
     z += 719468;
     const Int era = (z >= 0 ? z : z - 146096) / 146097;
     const unsigned doe = static_cast<unsigned>(z - era * 146097);          // [0, 146096]
     const unsigned yoe = (doe - doe/1460 + doe/36524 - doe/146096) / 365;  // [0, 399]
     const Int y = static_cast<Int>(yoe) + era * 400;
     const unsigned doy = doe - (365*yoe + yoe/4 - yoe/100);                // [0, 365]
     const unsigned mp = (5*doy + 2)/153;                                   // [0, 11]
     const unsigned d = doy - (153*mp+2)/5 + 1;                             // [1, 31]
     const unsigned m = mp < 10 ? mp+3 : mp-9;                            // [1, 12]
     return std::tuple<Int, unsigned, unsigned>(y + (m <= 2), m, d);
 }
 
 
 int main(){
    std::cout<< civil_from_days(15432)<<'\n';
 }

which gives this compiler errors.

The code is from Howard Hinnant

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

>Solution :

The call to the function is not the problem. The error you get (which you should have included in the question) is because there is no predefined output operator for tuples. Though, you can print the individual members:

int main(){
    auto res = civil_from_days(15432);
    std::cout<< std::get<0>(res)<<'\n';
    std::cout<< std::get<1>(res)<<'\n';
    std::cout<< std::get<2>(res)<<'\n';
 }
Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading