Haskellで書いてみたり…
data Month = Jan | Feb | Mar | Apr | May | Jun | Jul | Aug | Sep | Oct | Nov | Dec deriving Eq foo m = if elem m [Jan, Mar, May, Jul, Aug, Oct, Dec] then putStrLn "odd month" else putStrLn "even month"
Pascalで書いてみたり…
type TMonth = (Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec); procedure Foo(month: TMonth); begin if month in [Jan, Mar, May, Jul, Aug, Oct, Dec] then Writeln('大の月') else Writeln('小の月') end;
…しているうちに、配列を使ってもいいのなら別解があることに気がつきました。
配列に同じものが含まれる場合に真を返す関数。第2引数に配列を受け取るのがポイント。
template<typename T, int N> bool equalsEither(T x, const T (&a)[N]) { for(int i = 0; i < N; ++i) { if(x == a[i]) { return true; } } return false; }
C++では式の中で要素を並べて配列にするようなことができないので、式の外で配列を定義する必要があるという差がありますが。
#include <iostream> enum Month { Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec }; void foo(Month month) { const Month oddMonths[] = { Jan, Mar, May, Jul, Aug, Oct, Dec }; if(equalsEither(month, oddMonths)) { std::cout << "大の月" << std::endl; } else { std::cout << "小の月" << std::endl; } }