Опитах се да използвам това предложение, за да направя статично твърдение, но не получавам грешка при компилиране, ако го използвам в метод на шаблон.
Примерът е следният:
#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 );
}
Компилирах го с g++ 4.7.2, с предупреждение, че VLA не се поддържат от c++ ISO:
g++ -Wall -g -std=c++98 -Wextra -pedantic gvh.cpp
И така, защо компилацията не се проваля, когато STATIC_ASSERT се използва в метода на шаблона? Има ли начин да се провали?
ЗАБЕЛЕЖКА: Имам нужда от c++98 (може би дори c++03) решение, ако е възможно само с макроси.
const int
, не означава, че е константа по време на компилиране - това просто означава, че функцията взема копие на аргумента по време на изпълнение и няма да позволи на извикания код да го модифицира. Ще трябва да приеметеk
като параметър на шаблона (или заA
, или като направитеA::foo
катоtemplate <int K>
, или може би да си поиграете с C++11constexpr
, за да получите проверката на времето за компилиране, която очаквате. - person Tony Delroy   schedule 31.01.2013