2011-07-09 12 views
2

私はいくつかのテンプレート設定をしていますstruct、これらの構造体で静的なアサートを使用するのは大丈夫ですか?構造体内の静的アサートが許可されていますか?

template<typename T, int N, (and so on...)> 
struct Settings{ 
    static const int n = N; 
    STATIC_ASSERT(n == 5); 
    typedef typename T GAGA; 
} 

ご回答ありがとうございました!

+0

この例は意味をなさない... nが5でなければならない理由は、テンプレートパラメータ? –

+3

コンパイルして見ないのはなぜですか? – Xeo

+0

この例は、デモンストレーションの目的のみです...この種のテンプレートパラメータのチェックが良いのであれば、私はちょっとフィードバックを得たいと思っていました...そして、正しい静的なアサートマクロが使用されている限り、それはそこに使用することができます! :-) – Gabriel

答えて

1

正確に何が起こっているのかを確認するには、STATIC_ASSERTマクロ定義を調べる必要があります。使用することができるSTATIC_ASSERTの一般的な実装は次のようになります。

#define STATIC_ASSERT(x) \ 
    typedef char static_assert_failed[ (x) ? 1 : -1 ] 

通常もう少し策略は、複数のSTATIC_ASSERTが同じで使用することができるようにtypedefでの一部であるように行番号を取得することがありますこれは、構造体定義内の有効なコードに展開されるので、これが許可されていることがわかります。

template<typename T, int N, (and so on...)> 
struct Settings{ 
    static const int n = N; 
    typedef char static_assert_failed[ (n == 5) ? 1 : -1 ]; 
    typedef typename T GAGA; 
} 
2

私はあなたのSTATIC_ASSERTが何であるかわかりませんが、C++ 11スタイルのstatic_assertを使用して記述すると、これはうまく動作し、静的アサートのための完全な使い方のようです。 (まあ、おそらくそれは5ですが、チェックテンプレートパラメータがinstantatingに適してチェックしていない)

template<typename T, int N> 
struct Settings { 
    static const int n = N; 
    static_assert(n == 5, "Error"); 
    typedef typename T GAGA; 
}; 
0
template<typename T, int N> 
struct Settings 
{ 
STATIC_ASSERT(N == 5); 
typedef typename T GAGA; 
}; 

私はnを使用するには、有効な理由を参照してくださいいけません。

関連する問題