いくつかのテンプレート設定構造体がありますが、これらの構造体で静的アサートを使用しても大丈夫ですか?
template<typename T, int N, (and so on...)>
struct Settings{
static const int n = N;
STATIC_ASSERT(n == 5);
typedef typename T GAGA;
}
ご回答ありがとうございます!
いくつかのテンプレート設定構造体がありますが、これらの構造体で静的アサートを使用しても大丈夫ですか?
template<typename T, int N, (and so on...)>
struct Settings{
static const int n = N;
STATIC_ASSERT(n == 5);
typedef typename T GAGA;
}
ご回答ありがとうございます!
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;
};
template<typename T, int N>
struct Settings
{
STATIC_ASSERT(N == 5);
typedef typename T GAGA;
};
を使用する正当な理由がわかりませんn
。
正確に何が起こっているかを確認するには、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;
}