のデフォルトのコンストラクタを指定する方法はありますenum class
か?
を使用してenum class
、ライブラリ内の特定のデータ型に許容される一連の値を指定しています。この場合、これは Raspberry Pi の GPIO ピン ID 番号です。次のようになります。
enum class PinID : int {N4 = 4, N17 = 17, /* ...etc... */ }
たとえば、単に an を使用する代わりにこれを行うポイントは、int
コードが安全であることを確認することです: 私はできるstatic_assert
(またはそうでなければコンパイル時に保証する - 使用される実際のメソッドは私にとって重要ではない) 誰かがしていないようなことスペルミス (4 の代わりに 5 を渡すなど) があり、型の不一致などの自動エラーメッセージが表示されます。
問題enum class
は、デフォルトのコンストラクターがあり、C との互換性のために(動作が同じであるため)、と同等のものにenum
初期化されることです。この場合、値はありません。これは、ユーザーが次のような宣言/定義を行うことを意味します。enum class
0
0
PinID pid = PinID();
明示的に定義されていない列挙子を取得しており (コードを見ても「存在」していないように見えます)、実行時エラーが発生する可能性があります。これはまた、明示的に定義された列挙子の値に対する ing のような手法は、エラー/デフォルトのケースがなければ不可能であることを意味します。これswitch
は、私が避けたいことですthrow
。boost::optional
分析。
デフォルトのコンストラクターを無駄に定義しようとしました。私は (必死に) の名前を共有する関数を定義しようとしましたenum class
が、これは (驚くべきことではありませんが) 奇妙なコンパイラ エラーを引き起こしました。すべての列挙子をそれぞれの にマッピングして、 enum class
toをキャストする機能を保持したいので、N4 = 0 のように単に「定義」することは受け入れられません。これは単純さと正気のためです。int
N#
#
私の質問は 2 つあると思いenum class
ます。そうでない場合、他にどのような可能性を好むでしょうか? 私が欲しいのは次のようなものです:
- デフォルトで構築可能です
- デフォルト構成を任意の有効な値にすることができます
enum class
esによって提供される「指定された有限集合」の値を提供します- 少なくとも同じくらい型安全です
enum class
- (できれば) ランタイム ポリモーフィズムを含まない
デフォルトの構成可能性が必要な理由は、値boost::lexical_cast
間の変換に伴う構文上のオーバーヘッドと、オペレーティング システム (この場合は sysfs) に出力するenum class
実際の関連付けられたs を削減するために使用する予定があるためです。デフォルトの構築可能性が必要です。string
boost::lexical_cast
私の推論の誤りは大歓迎です --enum class
この場合、es が間違った仕事のための正しいオブジェクトであると疑い始めています。質問されれば、明確化が提供されます。お時間をいただきありがとうございます。