問題タブ [enum-class]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - オーバーロードされた演算子を呼び出すときの列挙型クラスのユーザー定義の暗黙的な変換が失敗する
次の例を検討してください。
コンパイラのバージョン:
上記の調査結果はclang 3.4
とgcc 4.8.2
です。テスト 2. 実際には で問題なくコンパイルさgcc 4.7.3
れ-std=c++11
ます。おそらく初期の GCC C++11 実装のバグ?
アサーション:
- 1. がコンパイルされると、
~
オペレーターを呼び出すときにユーザー定義の暗黙的な変換がチェックされます。 - 4. コンパイルすると、ユーザー定義の暗黙的な変換が
enum class
オブジェクトに対してチェックされます。
質問:
- 上記の主張は正しいですか?
- もしそうなら、なぜ 2. コンパイルに失敗するのですか?
- 2. はコンパイルに失敗するのに、なぜ 3. はコンパイルされるのでしょうか?
c++ - C++:任意の名前空間から同じクラス名のオブジェクトを受け入れる関数を取得する方法は?
MainClass.h:
MainClass.cpp:
それが私ができるようになりたいことです。これは可能ですか?現実的には、 enum クラスが継承のあるクラスのように振る舞えばいいのですが、それができないことはわかっています。これを書き直そうとすればするほど、実際にはケースごとに特定のクラスを作成しなければならなくなるまで、スパイラルが続きます (この例では 2 つだけではありません)。しかし、コードはすべて非常に似ています。
また、代わりにDoStuff(const Parameters p)をDoStuff(const int p_val)だけにして、外部で静的キャストを行うことを許可することも知っています...しかし、他の場所ですべての静的キャストを行う必要があり、私はしません'列挙型クラスの適切な型チェックを取得できません。
それが出来ないならそれでいいのですが…出来なかったら残念です。
c++ - 列挙型クラスを文字列 (c++) に変換する簡単な方法はありますか?
列挙型を stringに簡単に変換するソリューションはありますが、 を使用することによる安全上の利点がさらに欲しいと思いenum class
ます。を文字列に変換する簡単な方法はありenum class
ますか?
(列挙型クラスは配列にインデックスを付けることができないため、指定されたソリューションは機能しません)。
c++ - Codelite で C++11 機能を有効にする方法
次のコードは、Xcode 5 および Visual Studio 2013 でコンパイルおよび実行されます。Codelite を試すことに興味がありますが、Codelite は次のプログラムをコンパイルしません (プロジェクトでスコープ付き列挙型を使用しているため、問題が発生します)。私の知る限り、Codelite は Xcode と同じコンパイラを使用しています。
コードは C++11 ごとに有効ですか? Codelite でコンパイルできないのはなぜですか?
Codelite からのビルド出力は次のとおりです。文字化けしている場合は、変数のインスタンス化で「SampleEnum」という単語を指しており、「クラスまたは名前空間が必要です」と言っています。
c++ - 列挙型クラスで「reinterpret_cast」を使用する - 有効または未定義の動作?
このコードは常に機能することが保証されていますか? それとも未定義の動作ですか?
c++ - GoogleTest 1.7.0 `enum class` コンパイル エラー
enum class
テストフィクスチャからを参照しようとすると、エラーでコンパイルに失敗します./gtest_mcp23s17.cpp:25:52: error: no type named 'HW_ADDR_6' in 'mcp23s17::HardwareAddress'
TC_mcp23s17 _gpio_x(mcp23s17::HardwareAddress::HW_ADDR_6);
~~~~~~~~~~~~~~~~~~~~~~~~~~~^
ただし、テスト自体に参照を残すと (他のすべてのコードはそのままにしておきます)、エラーなしでコンパイルされ、期待どおりにテストが実行されます。これは GoogleTest のバグですか、それともテストに関する限り、このシナリオの違いは何ですか?
テスト (汎用): [コンパイル]
テスト フィクスチャ: [COMPILES]
テスト フィクスチャ (フィクスチャ クラスで宣言された gpio_x を使用): [失敗]
c++ - 列挙型クラスの c++ typedef/type 置換
現時点で私が知る限りtypedef
、 C++11を実行することはできませんenum class
。enum
カプセル化クラスの外で変数を参照するときに、変数の名前の長さを減らすことができる他の方法があるかどうかを知りたいです。次に例を示します。
最も重要な問題は、 のenum
外側を参照する必要がある名前の長さですSegmentActivityType
。たとえば、型の比較を行うには、 を記述する必要がありますがSegmentActivity.getState() == SegmentActivityState::ActivityStateType::PreExecution
、これは非常に冗長です。やりたくないことは次の2つです。
typedef
オンSegmentActivityState
。enum class
ActivityStateTypeoutside of the class
SegmentActivityState` 定義を移動します。
c++ - 参照によるスコープ列挙型の変更
範囲指定された列挙型が使いにくいことがますますわかっています。参照によって値を設定/初期化するスコープ列挙型のテンプレートを含む一連の関数オーバーロードを作成しようとしています--次のようなものです:
set_value
ただし、複数の一時的な値を導入せずにテンプレート化されたバージョンを記述する方法がよくわかりません。
static_cast
はに加えて 2 番目の一時的な値を導入すると思いますraw_val
。これらのいずれかまたは両方がコンパイラによって最適化される可能性があると思いますが、いずれにせよ、set_value
呼び出しは一時的な値も生成するため (インライン化されていないと仮定して)、パフォーマンスの点で大きな違いはありませんが、これはまだエレガントではないようです。私がやりたいことは次のようなものです:
...しかし、これは有効ではありません (また、参照の代わりにポインターを直接使用する対応するコードもありません)。
を使用することもできましたがreinterpret_cast
、これはいくつかの予備テストから機能しているように見えます (機能しない理由は思いつきません) が、C++ では眉をひそめているようです。
これを行う「標準的な」方法はありますか?