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
CodePudding user response:
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';
}