私のプロジェクトでは、複数の列挙型クラスを使用しています。これらは、使用する場所によって簡単にキャストする必要があります。彼らは基本的に同じことを記述しますが、コードをより使いやすくするために、異なる名前が付けられています。ここで列挙クラスがある:enumクラスのキャスト演算子のオーバーロード
enum class tetroType {
None, I, O, T, J, L, S, Z
};
enum class gridBlock {
Empty, Blue, Green, Orange, Purple, Red, Teal, Yellow
};
tetroTypeの各値がgridBlockの値に対応
(FE tetroType :: I = gridBlock ::ティール)が、最初はtetronimoに(tetronimoの形状に関する情報を保持していますクラス)、ブロックの色に関する情報(グリッドクラス)を保持します。代わりに1つの列挙型を使用することはできますが、この方法では情報を失うことはありません。また、可能ならば文字列にキャストする必要があります。これはどのように私がそれを使用したいのですか:
gridBlock grid = (gridBlock)tetroType::I;
string texture = (string)grid;
今私がそれをセットアップした方法はこれのようです。私は別に、または文字列に1つの列挙型を変換する必要がある時はいつでも、私は他の方法の真ん中にこのスイッチを使用しています:
switch (type) {
case tetroType::I:
block = gridBlock::Teal;
break;
case tetroType::O:
block = gridBlock::Yellow;
break;
case tetroType::T:
block = gridBlock::Purple;
break;
case tetroType::J:
block = gridBlock::Blue;
break;
case tetroType::L:
block = gridBlock::Orange;
break;
case tetroType::S:
block = gridBlock::Green;
break;
case tetroType::Z:
block = gridBlock::Red;
break;
case tetroType::None:
block = gridBlock::Empty;
}
キャスティングを「簡単に」行うべきではありません。 *あなたはあまりにも自由にキャストすることを控えるように、冗長で明示的にすべきです。 'gridBlock grid = toGridBlock(tetroType :: I)'と 'string texture = toString(grid);を書くことは良いことです。 –
私はこれを行うための最もエレガントで正しい方法を探していました。私はもう一つに変換する機能を持っていますが、それが正しい方法であるかどうかは分かりませんでした。また、その機能はどこにあるべきですか?列挙型宣言と一緒にヘッダファイル内にあるはずですか?これは、できるだけキャスト演算子が最も洗練されたソリューションになると思う理由です。 –
これは少し意見に基づいていますが、個人的には、自分のヘッダーに変換関数を置くことを好みます。必要なときにそれらを含めるだけです。そして再び、標準ライブラリ自体は(いつでも)それをしません。たとえば、 ''は 'std :: string' *と*さまざまな' std :: to_string'関数の両方を含んでいます。 –