LoginSignup
1
1

More than 5 years have passed since last update.

enumとintの比較を(intとの互換性を保ったまま)防ぐ

Last updated at Posted at 2013-09-15

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");
    }
}

デメリットやもっと上手な(行数の少ない)方法などあれば教えてください。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1