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

内部で以前に作った関数を呼び出していますので、リンクを貼っておきます。

また、引数のcalenderには前回のgregorianまたはjulianを指定します。

最初に書いたように、monthに指定する値は0~11でなければなりません。ですので、2021年2月29日が有効か否かを調べるのであれば、is_valid_day(2021, 1, 29, gregorian);のようにしますので注意してください。

ところで、旧サイトでは「メタ関数版も準備中です」と書いておきながらそのままになってしまっていました。あれから時間も経って今さらメタ関数版も必要ないと思いますので、constexpr版を作っておきます。

ほとんど変わりませんが、is_valid_day_helper関数内のテーブルもconstexprになっています。また、value_in_range_inclusive関数もconstexprにする必要があったのでいっしょに掲載しておきました。残念ながらC++11ではコンパイルできませんので、C++14以降対応になります。


元ネタ

↑ 10. 日付・グレゴリオ暦計算テンプレート