どうも、uncleです
明日1年生は3年生の発表会がありますね
かく言う私も発表者の1人なので少し緊張しています
では今回はenumについて少し掘り下げていきたいと思います
え?もう知ってる?
そう言わずちょっとお付き合いください
今回は「enumハック」、「enum class」、「namespace enum」を紹介します
[1回]
と言うことでenumを勉強していきます
■まず初めにenumってなんだっけ?
enumとは列挙型の事で定数をリストにして定義することが出来るというものです
例としては
この様に記述することで定数を宣言できるというものですね
定数は0から始まり、順に1,2,3と言う風に値が変わっていきます
つまりPythonは0、Rubyは3といった具合になります
使い方は
このようにして使用します
rand関数の乱数の質についてはまた機会があれば記事を書きたいと思います。
ここまででは一年生向けの記事ですね、
それでは次にenumハックと言う物を紹介します
これは古いコンパイラが使用されていた時に使用されていた技術らしく
残念ながら最近のC++のソースコードではお目にかかることは少ないかもしれません。
例を上げます。
11行目がenumハックと呼ばれるものになります。
12行目で配列の要素数を指定する為に使用しています
今では
static const int 変数名 = 値;
と記述するでしょう
Javaでは
private static final int 変数名 = 値;
ですね
とは言えこの
static const int 変数名 = 値;
この書き方は以前のコンパイラではエラーを吐いていたようです。
その打開案としてこのenumハックが使用されていたと言うことです。
そして今回の本題に移りましょう。
enumを使用していて名前が被ってしまうなんて事はありませんでしたか?
例えば
こんなコードを書いてみました。
enum Animalの初めにDog、
そしてenum Favoriteの3つ目(値は2)にもDogがあります。
23行目、26行目の様な記述をした場合には問題がありません。
ですが問題は24行目、27行目、29行目です。
24行目はエラーになっているため勿論問題ではあるんですが、
何が一番の問題かと言うと29行目にあります。
このコードを書いた私がTest5にAnimal型のDogを代入をしている「
つもり」、だった場合にどうなるでしょうか?
今回は変数の宣言しか行っていませんがバグの要因としては十分足り得ますよね
ではどうすればいいのか?
23行目や26行目の様に記述するように自分でルールを決めますか?
それでは△です。
自分で決めたルールはチーム制作では役に立ちません。
ではenumの定数の先頭に何か名前を付随しますか?
それも△です。
個人的にはあまりスマートだとは思いません
ではどうするのか?
そこでC++11で実装された「enum class」,「enum struct」を使用します
enumの後にclassもしくはstructを入れるだけで使用することが出来ます。
例を見てみましょう。
enum classとはなんなのか少し理解できたでしょうか?
簡単に説明すると従来のenumの制約を強めたもの。とでも言うのでしょうか、
上記のようにタグ名、スコープ解決演算子を使用しなければ使用できない
それがenum classです。
他にもenum class Animal : charと記述すれば
デフォルトではint型のAnimalの内部型をchar型にすることが出来ます
あとC++11での変更点としては
enum class Animal : char;
と言った感じで前方宣言も可能になったことでしょうか
前方宣言は通常のenumでも可能です
そしてキャストする場合には、
とでもしておけばキャストする際に便利ですね
ですが・・・、これが意外と面倒で
なぜenum classは内部型に暗黙的にキャストしてくれなくなったのかと私的には不満が残ります。
勿論プログラマ側に強制的に明示的なキャストを行わせるというのはバグを減らす為には必要なことだとは思うのですが逐一キャストが必要になると流石にタイプ数も馬鹿になりません。
ですので今回は
・タグ名、スコープ解決演算子の使用を強制させる
・キャストしなくてもいい
そんなenumを紹介します
では例に倣って例をどうぞ
何が変わったのでしょうか?
答えはenumにnamespaceを使用しました
これはstructでも代用が出来ます。
Microsoftではnamespace enumを、
NVIDIAなどではstruct enumを使用しています
では長くなりましたが今回は以上です
お疲れ様でした
PR
COMMENT