Статическое утверждение внутри структуры разрешено? - PullRequest
2 голосов
/ 09 июля 2011

У меня есть несколько структур настроек шаблона, можно ли использовать статические утверждения в этих структурах?

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

Спасибо за ваши ответы!

Ответы [ 3 ]

3 голосов
/ 09 июля 2011

Я не знаю, какой у вас STATIC_ASSERT, но если вы напишите его с использованием static_assert в стиле c ++ 11, тогда это прекрасно работает и выглядит как очень хорошее применение для статического утверждения. (Ну, возможно, не проверять, что это 5, но проверка параметров шаблона подходит для мгновенного запуска)

template<typename T, int N>
struct Settings {   
  static const int n = N;   
  static_assert(n == 5, "Error");   
  typedef typename T GAGA; 
};
0 голосов
/ 09 июля 2011

Вам нужно взглянуть на определение макроса 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;
}
0 голосов
/ 09 июля 2011
template<typename T, int N>
struct Settings
{  
STATIC_ASSERT(N == 5);  
typedef typename T GAGA;
};

Я не вижу веской причины для использования n.

...