switch(nValue)
{
case X:
...
case Y:
...
default:
ASSERT_FOR_DEFAULT(nValue);
}
ASSERT_FOR_DEFAULT
是一个宏,将显示一个(自定义)断言对话框,报告打“默认情况下, ”。是的,这个宏用于运行时断言,而不是编译时断言。但是,我只需要它,任何常量值(编译时)都不能传递给这个宏。
问题:
以下应在编译失败:
ASSERT_FOR_DEFAULT(5);
是,程序员可以在任何地方使用它,而不是仅仅在default
情况下switch-case
的。他也可以使用switch
中未使用的任何表达方式。但这不是问题。只需要只有非常量应该传递给这个宏。
没有什么重要的是为这个宏写的,只是假设它是ASSERT
/assert
。我使用了模板(用于其他SFINAE /静态断言!),数组(如strcpy_s
),自己的结构有YES
,NO
类型,什么不是。但找不到解决方案!
我正在使用VC2008。我知道static_assert
,decltype
等,但不能使用C++ 0x。
EDIT(解决方案):
#define STATIC_ASSERT(expr) {int array[!!(expr)]; expr;}
template <class T>
bool noConstAllowed(T&);
int noConstAllowed(...);
#define ASSERT_FOR_DEFAULT_VALUE(val) \
{ \
STATIC_ASSERT(sizeof(noConstAllowed(val))==sizeof(bool)); \
}
int main()
{
int test=10;
ASSERT_FOR_DEFAULT_VALUE(test);
ASSERT_FOR_DEFAULT_VALUE(2);
ASSERT_FOR_DEFAULT_VALUE(test+2); //FAILS, but okay for me!
}
感谢阿恩·默茨为这个可爱的建议。我从中推导出解决方案。 noConstAllowed
对于所有T&
类型都是过载的,并且如果传递了常量值,则将调用另一个过载。两者都有不同的返回类型,并因此检查大小。模板化版本返回bool
,它满足任何传递的变量的断言,并且对任何常量或表达式失败(因为返回类型为int
)。
Boost.StaticAssert – 2012-11-30 11:46:04
@aleguna,毫无意义的评论!我需要静态断言的表达式,而不是如何创建或使用静态断言。 – Ajay