4

いくつかのテンプレート設定構造体がありますが、これらの構造体で静的アサートを使用しても大丈夫ですか?

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

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

4

3 に答える 3

4

STATIC_ASSERTが何であるかはわかりませんが、c ++ 11スタイルのstatic_assertを使用して記述した場合、これは正常に機能し、静的アサートの完全に適切な使用法のように見えます。(まあ、おそらくそれが5であることをチェックしていませんが、テンプレートパラメータをチェックすることはインスタンス化に適しています)

template<typename T, int N>
struct Settings {   
  static const int n = N;   
  static_assert(n == 5, "Error");   
  typedef typename T GAGA; 
};
于 2011-07-09T08:53:48.267 に答える
0
template<typename T, int N>
struct Settings
{  
STATIC_ASSERT(N == 5);  
typedef typename T GAGA;
};

を使用する正当な理由がわかりませんn

于 2011-07-09T10:35:44.797 に答える
0

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

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

通常、行番号をtypedefの一部にSTATIC_ASSERTして、同じコンテキストで複数を使用できるようにするのは少し難しいですが、構造体定義の有効なコードに拡張されるため、これが許可されていることがわかります。 :

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;
}
于 2011-07-09T11:56:34.040 に答える