如何在使用 chrono 库将数字转换为日期的 cpp 的 main() 中正确调用此模板函数?
How can I call this template function correctly in main() in cpp which uses chrono library to convert a number to a date?
如何在使用 chrono 库将数字转换为日期的 cpp 的 main() 中正确调用此模板函数?
#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';
}
这会导致 this or this (the same) 编译器错误。
代码来自Howard Hinnant
调用函数没有问题。你得到的错误(你应该在问题中包含)是因为没有用于元组的预定义输出运算符。不过,您可以打印各个成员:
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';
}
如何在使用 chrono 库将数字转换为日期的 cpp 的 main() 中正确调用此模板函数?
#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';
}
这会导致 this or this (the same) 编译器错误。
代码来自Howard Hinnant
调用函数没有问题。你得到的错误(你应该在问题中包含)是因为没有用于元组的预定义输出运算符。不过,您可以打印各个成员:
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';
}