如何用宏做static_assert?

BЈо*_*вић 0 c++ macros g++ static-assert c++98

我曾尝试使用此建议来执行静态断言,但如果我在模板的方法中使用它,则不会出现编译错误.

示例如下:

#include <iostream>

#define STATIC_ASSERT(expr, msg)               \
{                                              \
    char STATIC_ASSERTION__##msg[(expr)?1:-1]; \
    (void)STATIC_ASSERTION__##msg[0];          \
}

template <typename T >
class A
{
public:
  int foo(const int k )
  {
    // does not work
    STATIC_ASSERT( k > 9, error_msg );
    return k+5;
  }
};

int bar(const int k )
{
  // works fine
  //STATIC_ASSERT( k > 9, error_msg );
  return k+5;
}

int main()
{
  A<int> a;
  const int v = 2;

  std::cout<<a.foo(v)<<std::endl;
  std::cout<<bar(v)<<std::endl;

  // works fine
  //STATIC_ASSERT( v > 9, error_msg );
}
Run Code Online (Sandbox Code Playgroud)

我用g ++ 4.7.2编译它,并警告说c ++ ISO不支持VLA:

g++ -Wall -g  -std=c++98 -Wextra -pedantic gvh.cpp
Run Code Online (Sandbox Code Playgroud)

那么,为什么在模板方法中使用STATIC_ASSERT时编译不会失败?有没有办法让它失败?

注意:我需要一个c ++ 98(甚至可能是c ++ 03)解决方案,如果可能的话只需要宏.

Max*_*kin 14

在C++ 11之前,我通常会这样做:

typedef int static_assert_something[something ? 1 : -1];
Run Code Online (Sandbox Code Playgroud)

您还可以查看boost static assert.但它对我来说太过臃肿了.很容易让事情变得更大,很难让它们变得更好.