enumを数値と比較して間違うことがよくまれにあります。
enum Food {
FOOD_CURRY,
};
void test() {
if (FOOD_CURRY == 100) { // コンパイルは通る
puts("drink");
}
}
enumとintの間でコンパイルエラーになるよう比較演算子を定義すると、intの自動変換によるミスが防げるので、安全装置として使えます。
void operator==(Food, int);
void operator!=(Food, int);
void operator==(int, Food);
void operator!=(int, Food);
void test() {
if (FOOD_CURRY == 100) { // 通らない
puts("ok");
}
}
C++11の場合、以下のようにすると定義がないという心残りが少し減ります。(scoped enumが使えればそのほうがよいのですが、こちらはenumを定義しているヘッダがいじれない場合でも勝手に手元でやれるというのが強みです)
void operator==(Food, int) = delete;
void operator!=(Food, int) = delete;
void operator==(int, Food) = delete;
void operator!=(int, Food) = delete;
void test() {
if (FOOD_CURRY == 100) { // 通らない
puts("ok");
}
}
enumも結局はintなので、この小細工で他enumとの比較もついでに防げます。
enum Beverage {
BEVERAGE_CURRY,
};
void test() {
if (FOOD_CURRY == BEVERAGE_CURRY) { // compile error!
puts("drink");
}
}
デメリットやもっと上手な(行数の少ない)方法などあれば教えてください。