次のメタ関数は、ある月のN回目のD曜日の日付を求めます。D1には、その月の1日の曜日を指定してください。
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
enum day_of_week { Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday }; template <int N, day_of_week D, day_of_week D1> struct nth_day_of_week_to_day { static const int value = (D - D1) < 0 ? (D - D1 + 7 + (N - 1) * 7 + 1) : (D - D1 + (N - 1) * 7 + 1); }; |
せっかくですのでconstexprを使った関数版も作ってみます。
0 1 2 3 4 5 6 |
constexpr int nth_day_of_week_to_day(int n, day_of_week d, day_of_week d1) { return (d - d1) < 0 ? (d - d1 + 7 + (n - 1) * 7 + 1) : (d - d1 + (n - 1) * 7 + 1); } |
最初のメタ関数と同名ですので、併用する場合はどちらかの名前を変更してください。
ところでC++20からは標準ライブラリのchronoに似たようなことをするための機能が追加されました。ただ、現時点では使えない処理系も多いようですので割愛します。