10.2 日付が有効か否かの判定 (グレゴリオ暦/ユリウス暦)

指定した日付が有効かどうかを判定する関数テンプレートです。元ネタとは異なり、std::tm 構造体の tm_mon に合わせて、月は 0~11 で指定するようにしています。あと、閏年用のテーブルも持たせることで、コードを単純化しました。

inline bool is_valid_day_helper(int year, int month, int day, bool leap)
{
  static const char days_in_month[2][12] =
  {
    { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 },
    { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }
  };
  return value_in_range(0, month, 11)
      && (1 <= day && day <= days_in_month[leap][month]);
}

template<class Calender>
inline bool is_valid_day(int year, int month, int day, Calender calender)
{
  return is_valid_day_helper(year, month, day, is_leapyear(year, calender));
}

メタ関数版も現在準備中です。もうしばらくお待ちください。


元ネタ
このエントリーを含むはてなブックマーク