允许在struct内部静态断言?

时间:2011-07-09 08:02:07

标签: c++ static-assert

我有几个模板设置struct,可以在这些结构中使用静态断言吗?

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

感谢您的回复!

3 个答案:

答案 0 :(得分:3)

我不知道您的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; 
};

答案 1 :(得分:0)

template<typename T, int N>
struct Settings
{  
STATIC_ASSERT(N == 5);  
typedef typename T GAGA;
};

我没有看到使用n的正确理由。

答案 2 :(得分: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;
}