enum classes
の複合型を作成したいとします。私は小なり演算子をオーバーロードする必要がありますstd::map<>
のようなSTLコンテナにObject
を使用するためには2つの列挙型クラスから複合型を作成すると、STLマップの準備ができます
enum class Color {RED, GREEN, BLUE};
enum class Shape {SQUARE, CIRCLE, TRIANGLE};
class Object {
Color color;
Shape shape;
public:
};
。しかし、1つの線形インデックスに両方の列挙型クラスを平坦化するために、私は何とか列挙型クラスの要素数(NOE)が必要です:
friend bool operator< (const Object &lhs, const Object &rhs) {
return NoE(Shape)*lhs.color+lhs.shape < NoE(Shape)*rhs.color+rhs.shape;
}
これは、同じ情報(要素の数)を入力せずに行うことができますどのようにプログラムの2つの場所で良い方法で? (いい方法は、FIRST_ELEMENT, LAST_ELEMENT
、プリプロセッサの魔法などを意味しません)
質問(Number of elements in an enum)は、類似していますが、enum classes
には該当しません。
この種の複合型をC++ 11で実装する最良の方法は何ですか。 enumクラスの定義は十分に強力ですか、それとも言う必要がありますか?
enum class Color {RED=0, GREEN=1, BLUE=2};
enum class Shape {SQUARE=0, CIRCLE=1, TRIANGLE=2};
「enum」の状況は、C++ 11では変更されていません。 – syam
なぜ平らにする必要がありますか?これは厳密な弱い順序付けを必要とするだけの 'std :: map'では必要条件ではありません。ネストされた比較で簡単に行うことができます。 – Chad
'operator <'は 'map'のキーである場合にのみ必要です。値ではありません。それが鍵だと仮定すると、比較器で 'Color'か' Shape'優先順位を与えてみてはどうでしょうか?投稿された '演算子'よりもそれほど意味がありません。 – hmjd