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.但它对我来说太过臃肿了.很容易让事情变得更大,很难让它们变得更好.
归档时间: |
|
查看次数: |
6383 次 |
最近记录: |