Этот код демонстрирует утверждение времени компиляции с использованием шаблона. Я обнаружил, что его можно скомпилировать только с помощью g ++ (4.4.7) со следующей строкой cmd.
$ g++ -std=c++98 a.cpp -o a
Nether icc (13.0.1) или Visual C ++ (14.00.50727.762 для 80x86) не могут его скомпилировать. Для icc он генерирует сообщение об ошибке, подобное этому
$ icpc a.cpp -o a
a.cpp(13): error: non-integral operation not allowed in nontype template argument
COMPILE_TIME_ASSERT(true && "err msg");
^
a.cpp(13): error: class "CompileTimeAssert<<error-constant>>" has no member "Check"
COMPILE_TIME_ASSERT(true && "err msg");
^
compilation aborted for a.cpp (code 2)
Однако я обнаружил, что утверждения типа true && "err msg"
широко используются в утверждениях во время выполнения как Добавить пользовательские сообщения в assert? < / а>
Вопросы
- Можно ли решить эту проблему без изменения кода, только с правильными параметрами компиляции?
- Если не может, какие альтернативные методы времени компиляции утверждают с помощью настраиваемых сообщений?
Демо-код выглядит следующим образом.
#include <iostream>
template<bool B> class CompileTimeAssert { };
template<> class CompileTimeAssert<true> {
public:
static inline void Check() { }
};
#define COMPILE_TIME_ASSERT(b) CompileTimeAssert<(b)>::Check()
int main()
{
COMPILE_TIME_ASSERT(true && "err msg");
std::cout<<(true && "err msg")<<std::endl;
return 0;
}
typedef char assert_XXX[(condition?1:-1)];
), но вы могли бы подумать об изменении макроса, чтобы строка передавалась в функцию:COMPILE_TIME_ASSERT(condition,"Message")
расширился бы доCompileTimeAssert<(condition)>::Check("Message")
, который после адаптации подписи, вероятно, будет легче переваривать для всех компиляторов - person David Rodríguez - dribeas   schedule 25.07.2013