問題タブ [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つの型が同じかどうかを確認する方法(Boost strong typedefで動作する場合のボーナスポイント)
コンパイル時に2つの型が同じかどうかを確認できるかどうか疑問に思っていました。私が思いついたのは(ハックっぽい感じがするのでうまくいくかどうか、そしてIDK標準が良いのでIDKがテスト時に何を探すべきかということです)。
利用方法 :
そう
1) より良い方法はありますか?
2)関数ハックのこのアドレスは、標準で動作することが保証されていますか(私はそうではないでしょう:))?
c++ - コンパイル時の std::cout と同等、または c++11 でのコンパイル時の定数値の static_assert 文字列化
コンパイル時に aconstexpr
またはd 値の値を出力する方法はありますか? #define
に相当するstd::cout <<
、または次のようなことを行う何らかの方法が必要です
編集:constexpr
少なくともgccでは、次のようなことを行うことで、sを使用して基本的なコンパイル時の印刷を行うことができます
それは私に与えますerror: incomplete type ‘display_non_zero_int_value<1>’ used in nested name specifier static_assert(v == 0 && display_non_zero_int_value<v>::foo, "v == 0");
。(一方、icpcはあまり役に立たず、ただ言うだけerror: incomplete type is not allowed
です)これを一般化して、次のようなことができるようにするマクロを作成する方法はありますか
どういうわけか、4を含むエラーメッセージが表示されますか?
c++ - コンパイル時定数をチェックするための静的アサートがマクロに渡されない
前文:
ASSERT_FOR_DEFAULT
「デフォルトの場合」のヒットを報告するための(カスタム)アサーションダイアログを表示するマクロです。はい、このマクロは実行時アサーション用であり、コンパイル時アサーション用ではありません。ただし、必要なのは、定数値(コンパイル時)をこのマクロに渡すことはできないということです。
問題:
以下はコンパイル時に失敗するはずです:
はい、プログラマーは、のdefault
場合だけでなく、どこでも使用できますswitch-case
。彼は、で使用されていない任意の式を使用することもできますswitch
。しかし、それは問題ではありません。非定数のみをこのマクロに渡す必要があります。
このマクロについて書かれた重要なことは何もありません。ただASSERT
/であると仮定してassert
ください。
テンプレート(他のSFINAE / static-assertsを使用しました!)、配列(などstrcpy_s
)、独自の構造体YES
、NO
タイプなどを試してみました。しかし、解決策を見つけることができませんでした!
私はVC2008を使用しています。static_assert
、などは知ってdecltype
いますが、C++0xは使えません。
編集(解決策):
この素敵な提案をしてくれたArneMertzに感謝します。私はそれから解決策を導き出しました。
noConstAllowed
はすべてのT&
タイプでオーバーロードされ、定数値が渡されると、別のオーバーロードが呼び出されます。どちらもリターンタイプが異なるため、サイズをチェックします。テンプレート化されたバージョンは、bool
渡された変数のアサートを満たし、定数または式では失敗するを返します(戻り型はint
)であるため。
c++ - static_assert()でコンパイル時に整数を表示します
これが私がやろうとしていることの簡略版です
しかし、アサーションメッセージにFirst::nbElementFirstEnumとSecond::nbElementSecondEnumの値を出力できるようにしたいと思います(明らかに機能しないコメント付きバージョンのように)。「#」でマクロ連結を使用してみました。また、可変個引数テンプレートを使用して、各数値を%10で取得し、取得した値に「0」文字を追加しようとしましたが、取得するのはconstexprchar[]だけです。
だから私の質問は、列挙型の値を文字列リテラルで出力する方法を教えてください。
重複の可能性:
C ++ 11 static_assert:パラメーター化されたエラーメッセージ
最も興味深いトピックはこれでした: コンパイル時にsizeof(T)を出力し ますが、値を知るための警告やコメント解除コードは必要ありません。
c++ - テンプレートの特殊化を検出するためのテンプレート メタ関数
この質問に触発されて、与えられた2つのテンプレートのインスタンス化を検出するために導入できるコンパイル時のチェックがあるかどうか疑問に思っています:
同じ定義から構築されているか、Templ
テンプレートの異なる特殊化から構築されている場合
したがって、基本的に仮想テンプレート関数は次のように動作します。
この種のメタ関数を作成することは可能ですか?
c++ - クラスをインスタンス化しない場合、テンプレート化されたクラス コンストラクターで static_assert を起動する必要がありますか?
次のコードは、次の理由により GCC でコンパイルされませんstatic_assert
。
ただし、同じコードが Visual Studio 2012 でコンパイルされます。クラスを実際にインスタンス化した場合にのみコンパイル エラーが発生します (また、クラスを非テンプレート化すると、クラスをインスタンス化せずに static_assert がトリガーされます)。
標準に従って動作しているコンパイラはどれですか? GCCだと思いますが、標準に明確な確認が見られません。
c++ - C++の隠された仮想警告を安全に削除する
変更している既存のコードの非表示の仮想メソッドについて、Sun C++5.10コンパイラからコンパイル警告が表示されます。何らかの理由で、作成者は特定のデータ型に対して関数のオーバーライドを実装していません。私はここで状況を再現しました:
Concrete
クラスは実装されておらず、void visit( Triangle& obj ) {}
これにより次のエラーメッセージが表示されます。
コードは正常に機能しますが、この警告メッセージを削除すると便利です。したがって、コンパイラが満足するように関数を実装したいのですが、現時点では明らかに必要ないため、使用できないように(できればコンパイル時に検出されるように)。
コンパイルを許可するが使用を防ぐためにコンパイルアサーションを実装する方法はありますか?BoostまたはC++11にアクセスできません。
c++ - C++ 静的型チェック (BOOST) が Eclipse CDT によって誤ってフラグ付けされる
したがって、BOOST ライブラリを使用して、テンプレートが特定の基本クラスによって使用されていることを静的にチェックしたいと考えています。たとえば、次のようになります。
だから、私は を使いたかったのですがBOOST_STATIC_ASSERT( ( boost::is_base_of<DesiredBaseClass, T>::value ) )
、これは GCC でうまく機能します。ただし、Eclipse はこれに非常に悩まされており、エラーをリストしています (独自のパーサーによると思います)。
エラーは次のとおりです。
Eclipse が文句を言うのを止める良い回避策を知っている人はいますか? パーサーをオフにすることもできますが、一般的に、問題の検出にはかなり優れていると思います。
c++ - C ++コンパイル時に独自の警告を作成する方法
プリプロセッサではなく、コンパイル時に独自の警告を作成したい (いくつかの回答を見てきました)。
ユーザーが行う場合:
A first;
その後:
A second(first);
彼は、コピーが構築されていないなどのエラーが発生します..私のコードには多くの継承が含まれていることに注意してください.コピーコンストラクターを使用するには...
だから..コンパイラのデフォルトの警告の代わりに、私は自分自身を作成したいと思います....何か..「コピーコンストラクタは使用できません」
ヘルプ?ありがとう!
c++ - マクロで static_assert を行うには?
この提案を使用して静的アサートを実行しようとしましたが、テンプレートのメソッド内で使用してもコンパイル エラーは発生しません。
例は次のとおりです。
VLA は c++ ISO でサポートされていないという警告とともに、g++ 4.7.2 でコンパイルしました。
では、テンプレート メソッド内で STATIC_ASSERT を使用すると、コンパイルが失敗しないのはなぜでしょうか? 失敗させる方法はありますか?
注:可能であれば、マクロのみで、c++98(おそらくc++03)ソリューションが必要です。