問題タブ [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++ - static_assert を使用してテンプレート タイプを適用する
の有用性を理解しようとしてstatic_assert
います。設計を実施するのに役立つかどうか、もしそうならその方法を知りたいです。
テンプレート型のサイズに基づいて部分的に特殊化された別のテンプレート クラス内に独自の実装を隠す一般的なテンプレート クラスがあります。このデザインの概要は次のとおりです。
Fooは、サイズがHelperT
の特殊化によってサポートされている場合にのみサポートされます。たとえば、との両方がサポートされています。ただし、ユーザーが. 通常、Helperの特殊化が定義されていないため、エラーが発生しますが、これは意図された動作です。Foo<long>
Foo<unsigned long>
Foo<bool>
bool
static_assert
このインターフェースのユーザーにより役立つエラーを提供するために、この設計で使用する方法はありますか?
さらに、サイズが正しい場合でも、ユーザーが特定のタイプを使用することを制限したいと考えています。たとえば、Foo<float>
許可されるべきではありません。現在、これを強制する唯一の方法は、ドキュメントに太字のコメントを記載することです。:)
c# - Code Contracts を使用して C# でコンパイル時にアサートするにはどうすればよいですか?
この回答によると、 C# には、C++ コンパイル時のアサートの代わりに使用できる「コード コントラクト」が追加されました。今、私はこの魔法のコードを持っています:
IntPtr
と同じサイズである必要がありますInt32
。だから私はそのためにコンパイル時のアサートが欲しい - このC++コードのようなもの
だから私は次のことを試しました:
確かに失敗するようにパスfalse
しAssert()
ますが、コンパイルは問題なくパスします。
では、コード コントラクトを使用してコンパイル時にアサートするにはどうすればよいでしょうか。
c++ - 可能であれば static_assert に展開する assert マクロ?
メンバー関数の結果に対してアサーションを実行する必要がある一般的なコードがいくつかあります。このメンバー関数は である場合もあればconstexpr
、そうでない場合もあります。
t.member_function()
は定数式かもしれないので、そのような場合はとして扱うことができるかどうか疑問に思っていstatic_assert
ますが、それ以外の場合は通常の にデフォルト設定されていますassert
。これは可能ですか?
c++ - decltype( constexpr 変数)
constexpr 変数の decltype が失敗するのはなぜですか?
c++ - const int[2] は自明にコピー可能ですか?
次のようなテンプレート化されたメンバー関数があります。
次に、次のような方法でこの関数を呼び出します。
これを Visual Studio 2012 でコンパイルすると、エラー メッセージは表示されず、プログラムの機能は想定どおり (つまり、データがビットごとに送信される) ですが、コンパイラの最新バージョンである Visual Studio 2013 でコンパイルすると、静的アサートは失敗し、コンパイラは次のステートメントを発行します。
では、コンパイラのどのバージョンが標準に準拠しているかconst int[2]
、簡単にコピーできるかどうかは?
編集: これは Visual Studio 2013 のバグです。Microsoft Connect レポートはこちら
c++ - オブジェクト サイズに関する `static_assert` のより良いメッセージ
私はstatic_assert
(および標準化前のバリアントを)かなり頻繁に使用してきました。私たちの多くが使用していると確信している用途の 1 つは、機密データ構造のサイズがプラットフォームや構成全体で想定どおりに維持されるようにすることです。例えば:
ここで、この特定の用途に役立つ便利なマクロを作成しました。
次のように使用します。
この出力を生成するもの:(コンパイル時に、明らかにコンパイルエラーの形で)
「SizeSensitiveClass」のサイズが期待値と一致しません。
これは問題ありませんが、このマクロの実装を (インターフェイスをそのまま維持して) 拡張して、データ構造の現在のサイズと予想されるサイズも出力できるかどうか疑問に思っていました。理想的には、出力は次のようになります。
「SizeSensitiveClass」のサイズが期待値と一致しません (20 対 18)。
今のサイズでも非常に便利です。これは可能ですか?
VC12 (Visual C++ 2013) と GCC 4.8.1 を使用しています。少なくともこれら2つに移植できるソリューション/テクニック/方法をいただければ幸いです。
私は一般的な「文字列化」トリックを試しましたが、うまくいきませんでした (期待していたように) sizeof(T)
、出力にリテラル文字列が生成されるだけです。
これが s (メッセージ文字列を生成するため)を使用して実装される可能性があるという漠然とした考えがありますconstexpr
が、私はそれらに慣れていません。
c++ - static_assert 予期しない動作
operator&
パラメータがポインタである場合、静的アサートを行うクラスのオーバーロードがあります。
この演算子を使用すると、型が明らかにポインターではない場合でも、常にアサーションが得られます。std::cout << "is_pointer : " << std::is_pointer<T>::value << std::endl;
ゼロを印刷しています...
例。