2016-04-22 7 views
0

一般的なアプローチの1つは、MAXを最後の要素として追加することですが、常に望ましいとは限りません。追加要素を定義せずにコンパイル時にenumクラスサイズを取得

他の方法はありますか?可能ですか

constexpr size_t enum_size = sizeof(EnumClassName)/sizeof(std::underlying_type(EnumClassName)? 

これは安全ですか?私が詰め物について心配する必要があるかどうか確かめない。私の印象は、列挙型アイテムのサイズがすべて同じであるため、列挙型クラスにパディングするべきではないということです。基になる型としてuint8_tまたはuint16_tのみを使用すると仮定します。

+4

答えは常に1になりませんか? – NathanOliver

+0

@NathanOliverあなたは正しいです...列挙型は集計ではありません.. – szli

答えて

1

あなたが探しているもの(または少なくとも、MAX列挙子が提供するもの)は、最も大きな実際の列挙値です。これは、列挙に格納できる最大値とは異なります。後者はstd::numeric_limits<typename std::underlying_type<Enumeration>::type>::max()で定義されます。

列挙型で最大の列挙値を自動的に取得する方法はありません。まあ、自動的にはありません。

1

あなたがお勧めするものは、あなたが期待することをしません。悲しいことに、C++ではそのようなことはサポートされておらず、数値的な制限もありませんが、の列挙値が連続していて0から始まる場合にのみ簡単に実行できます。

Better Enumsなどのライブラリがあります。とりわけ、名前から文字列への変換などの列挙型は、列挙値の数の決定も提供します。
これを実装するには、マクロ濫用のlooooooooooootが必要なので、少し重いです。ポジティブな面では、バイナリサイズではなく、コンパイル時に価格を支払うだけです。

関連する問題