私は機能書いた:[C++コンパイル時のアサーション]:条件が満たされないとコンパイルエラーを投げることはできますか?
template<int N> void tryHarder() {
for(int i = 0; i < N; i++) {
tryOnce();
}
}
を、私は唯一のNは0〜10である場合、それはコンパイルしたい、私はそれを行うことができますか?どうやって?
私は機能書いた:[C++コンパイル時のアサーション]:条件が満たされないとコンパイルエラーを投げることはできますか?
template<int N> void tryHarder() {
for(int i = 0; i < N; i++) {
tryOnce();
}
}
を、私は唯一のNは0〜10である場合、それはコンパイルしたい、私はそれを行うことができますか?どうやって?
あなたはstatic_assert
declarationでそれを行うことができます。
template<int N> void tryHarder() {
static_assert(N >= 0 && N <= 10, "N out of bounds!");
for(int i = 0; i < N; i++) {
tryOnce();
}
}
この機能は、C++ 11以降のみavaliableです。 C++ 03で動かない場合は、をご覧ください。
このアイデアは素晴らしいエラーメッセージです。あなたがそれらのために気にしない、またはいなくてもブーストaffor、あなたが何かを行うことができますすることができた場合は、次のように:
template<bool B>
struct assert_impl {
static const int value = 1;
};
template<>
struct assert_impl<false> {
static const int value = -1;
};
template<bool B>
struct assert {
// this will attempt to declare an array of negative
// size if template parameter evaluates to false
static char arr[assert_impl<B>::value];
};
template<int N>
void tryHarder()
{
assert< N <= 10 >();
}
int main()
{
tryHarder<5>(); // fine
tryHarder<15>(); // error, size of array is negative
}
#if !defined(__cplusplus)
#error C++ compiler required.
#endif
これは一例です。ここで
がソースリンクです:私が言っているすべては、あなたも
を#エラー使うことができるということですhttp://msdn.microsoft.com/en-us/library/c8tk0xsk(v=vs.71).aspx
これは、ディレクティブ
編集@Pratik Chowdhruyです:私はポール・R.に同意しますこれは質問に直接答えません。事前C++ 11のコンパイラのためのコミュニティ
これは質問に答えません。 –
他の回答を見て、問題が何であるかを理解してください。OPは、条件付きコンパイルと '#error'の使用方法ではなく、テンプレートパラメータに対してコンパイル時アサートを行う方法を知りたいと考えています。 –
申し訳ありませんPaul R –
に申し訳ありませんが、あなたがこれを行う方法の説明については、非型パラメータN.
のテンプレートパラメータ制約を実装することができ、参照してくださいhttp://stroustrup.com/bs_faq2.html#constraints
[static_assert](http://en.cppreference.com/w/cpp/language/static_assert)をご覧ください – juanchopanza
@juanchopanza:それは答えです。 – Nawaz
すごくいいですね!しかし、C++ 11以前のものはありますか? – MciprianM