問題タブ [static-assert]
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++ - テンプレート パラメータが 2 のべき乗であるかどうかを確認するにはどうすればよいですか?
2^N バイトの配列を静的に割り当てる構造を作成したいのですが、この構造のユーザーにこのサイズを指数として指定してほしくないのです。例:
このテンプレート パラメータが 2 のべき乗であるかどうかを確認し、これについて適切なメッセージでユーザーに警告するにはどうすればよいですか?
簡単なテンプレートでこれを確認できました。
ただし、これについてユーザーに適切なメッセージで警告することはできません。何か案は?
編集
あいまいな例を修正しました。
編集
1 は確かに 2 のべき乗です。それを修正しました!:)
編集
BOOST_STATIC_ASSERT を使用すると、GCC でこのコードのコンパイル エラーが発生します。
エラー
編集
わかりました。これは、アサートが失敗したときに受け取るはずのメッセージでした。しかし、それではユーザーにまともなメッセージを伝えることができません。:(
c++ - C++11 static_assert (およびそこで使用される関数)
static_assert
テンプレートと一緒に非常に優れた機能のようです。
しかし、コンパイル時にさまざまなテストを行うための標準ライブラリの関数を見つけるのに苦労しています。
たとえば、型が別の型のサブタイプであるかどうかを確認する関数を探しています。boost::is_base_of
仕事はしますが、標準で同等の機能であるため、ブーストに頼る必要はありません。
static_assert
基本的に、 C++11 の標準ライブラリで使用でき、含まれている関数のリストの良いソースはありますか?
いつstatic_assert
実行されますか?テンプレートのどこにでも配置できますか? テンプレートのインスタンス化ごとに評価されますか? テンプレート パラメータをクラスの特定のサブタイプに制限するために使用できますか?
c++ - C ++ 11 static_assert:パラメーター化されたエラーメッセージ
前の質問では、static_assertを使用して、テンプレートパラメーターを特定のサブタイプに制限したいと思いました。質問に答えました。アーカイブのコードは次のとおりです。
ここで、エラーメッセージをより簡潔にします。つまり、どのタイプがこの制約に違反しているのかを述べたいと思います。たとえば、クラスA
が派生しておらずY
、誰かがインスタンスX<A>
化した場合、エラーメッセージは「typeパラメータはYから派生している必要がありますが、Aは派生していません」と出力する必要があります。
これは標準ライブラリでどういうわけか達成可能ですか?
2つの課題があります。
- boost::mplを使用せずにコンパイル時に文字列をアセンブルする
- Tがインスタンス化されたタイプの名前を取得します。名前は意味のあるものでなければならず、理想的には違反している定義で使用されているものと同じである必要があります。typeid(T).name()を試しましたが、受け入れられないマングル名しか返されません。何かの名前を返すマクロがあったことを覚えていますが、それはもう思い出せません。
c++ - static constクラスのデータメンバーをチェックするための静的アサート?
「静的 const」データ メンバーを持つクラスがいくつかあります。コンパイル時に static_assert を使用してそれらの値をチェックする方法を知りたいです。クラス本体に直接 static_assert を入れることはできますか? (すべてのコンストラクターに static_assert を入れるのはあまり実用的ではありません。)
c++ - typedef で static_assert をトリガーする必要がありますか?
インスタンス化が行われると、クラス テンプレートの静的アサーションがトリガーされないことに気付きましたtypedef
。
このコードはエラーなしでコンパイルされます。インスタンスを作成しようとすると、アサーションが失敗します。
最後に、条件を に置き換えるとfalse
、クラス テンプレートをインスタンス化しなくてもアサーションは失敗します。
このコードを gcc-4.5.1 と gcc-4.7.0 で試しました。この動作は正常ですか?コンパイラはいつ静的アサーションを検証することになっていますか? 2 フェーズのルックアップが関係していると思いますが、typedef が 2 番目のフェーズをトリガーするべきではありませんか?
c++ - VS2010 では、static_assert を使用して、クラスの先頭からの変数のオフセットに関する仮定を検証することは可能ですか?
簡単な例を次に示します。
クラス A が MyClass の基本クラスを介して MyClass の機能のサブセットを利用できると仮定すると、クラス A のインスタンスに対する 'm_class' の場所に関する仮定を検証したいと思います。
クラス B のメンバー関数内から次のコードを試しましたが、エラーが発生します (「予期された定数式」)。
これは、現在のバージョンのコンパイラにとっては野心的すぎるのでしょうか?
c++ - static_assertをsizeofおよびstringifyと組み合わせる方法は?
私のアプリケーションでは、メモリ使用量が非常に重要です。したがって、コンパイル時にメモリサイズをチェックし、サイズが以前に正しいと見なしたものと異なる場合はstatic_assertを与える特定のアサーションがあります。
私はこのようなマクロを定義しました:
このマクロを使用すると、次のように簡単に記述できます。
問題は、このstatic_assertがオフになると、新しいサイズを見つけるのが非常に難しい場合があることです(たとえば、非表示のコンパイラオプション "/ d1 reportAllClassLayout"を使用することによって)。実際のサイズを含めることができれば、はるかに便利なので、次の代わりに:
ブックのサイズが正しくありません!
それは表示されます
ブックのサイズが正しくありません!(予想144、サイズは152)
私はこのようなものを書いてみました:
ただし、関数呼び出しでstringize(#)演算子を使用することはできません。
また、次のように、二重文字列化のトリックを追加してみました。
ただし、印刷する代わりに、を印刷size is 152
しますsize is sizeof(Book)
。
static_assertでsizeofの結果を文字列化する方法はありますか?
c++ - テンプレートで許可される引数を指定する
テンプレートが受け取ることができる引数の種類を正確に指定できますか? たとえば、 class または class を拡張するクラスでのみインスタンス化できるテンプレートを作成したいと思いますA
。Java では、ジェネリックは次の方法でこれをサポートします。
C++ のテンプレートで同様のことを実現できますか?
c++ - SFINAE の代わりに static_assert を使用するのはいつですか?
static_assert
テンプレート パラメーター値の望ましくない値にフラグを付けるために使用してきました (使用されていることがわかりました)。ただし、私が遭遇したすべてのケースで、SFINAE を介してこれらの望ましくない値を無効にする方が適切でエレガントなようです。
例えば:
それ以外の:
私の質問: static_assert
SFINAE の代わりに使用する必要があるのはなぜですか?
編集:
これまでに学んだことは次のとおりだと思います。
1. SFINAE は多機能で強力ですが、潜在的に非常に複雑なツールであり、関数のオーバーロードの解決 (唯一の目的と見なす人もいます) など、多くのタスクに使用できます。
2. SFINAE は、その定義ではなく (クラスまたは関数の)宣言static_assert
に現れることを除いて、可能な限りどこでも比較的単純な方法で使用できます (または、クラスの前方宣言に aを挿入することは可能ですか?) . これにより、より逐語的になり、コードがより明確になります。ただし、SFINAE は複雑なため、単純な.static_assert
static_assert
3.一方static_assert
、より明確なコンパイラ エラー メッセージの利点があり、これが両方の主な目的と見なされているようです。