2013-04-24 10 views
6

私は機能書いた:[C++コンパイル時のアサーション]:条件が満たされないとコンパイルエラーを投げることはできますか?

template<int N> void tryHarder() { 
    for(int i = 0; i < N; i++) { 
     tryOnce(); 
    } 
} 

を、私は唯一のNは0〜10である場合、それはコンパイルしたい、私はそれを行うことができますか?どうやって?

+6

[static_assert](http://en.cppreference.com/w/cpp/language/static_assert)をご覧ください – juanchopanza

+0

@juanchopanza:それは答えです。 – Nawaz

+0

すごくいいですね!しかし、C++ 11以前のものはありますか? – MciprianM

答えて

13

あなたは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 
} 
+0

これは、「N」がコンパイル時定数tho 'であると仮定します。 –

+1

'template に変更すると少しシンプルになりました。void tryHader(){static_assert(N <= 10、" N out of bounds! ");' – Yakk

+4

@MatsPeterssonをテンプレート引数として、それはコンパイル時定数であるという安全な前提です。 – Yakk

-2
#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のコンパイラのためのコミュニティ

+0

これは質問に答えません。 –

+0

他の回答を見て、問題が何であるかを理解してください。OPは、条件付きコンパイルと '#error'の使用方法ではなく、テンプレートパラメータに対してコンパイル時アサートを行う方法を知りたいと考えています。 –

+0

申し訳ありませんPaul R –

1

に申し訳ありませんが、あなたがこれを行う方法の説明については、非型パラメータN.

のテンプレートパラメータ制約を実装することができ、参照してくださいhttp://stroustrup.com/bs_faq2.html#constraints

関連する問題