Похоже на решение iammillind, которое, к сожалению, было полезно только во время выполнения:
template <int A, int B>
class VALUES {
};
// specialization to provide safe passage for equal values
template <int X>
class VALUES<X, X> {
public:
static void MY_VALUES_ARE_EQUAL() {}
};
#define ASSERT_EQUALITY(a, b) \
{ \
typedef VALUES<a, b> COMPILE_TIME_ASSERTION; \
COMPILE_TIME_ASSERTION::VALUES_ARE_EQUAL(); \
}
int main() {
ASSERT_EQUALITY(1, 1); // compiles just fine
ASSERT_EQUALITY(1, 2); // ERROR!
// . . .
}
Приятно то, что оно предоставляет хорошее сообщение компилятора.Мой компилятор сообщает мне следующее:
'VALUES_ARE_EQUAL' не является членом 'COMPILE_TIME_ASSERTION {aka VALUES <1, 2>}'
Вам не нужноtypedef.Без:
'VALUES_ARE_EQUAL' не является членом 'VALUES <1, 2>'
Конечно, есть множество других способов генерировать полезные сообщения,Для хихиканья:
// these give use some tips in the compiler warnings
class COMPILE_TIME_EQUALITY_ASSERTION {} compiler_message;
class EQUAL_VALUES_ONLY_PLEASE {};
template <int A, int B>
class VALUES {
public:
static void AreEqual(EQUAL_VALUES_ONLY_PLEASE) {}
};
template <int X>
class VALUES<X, X>
{
public:
static void AreEqual(COMPILE_TIME_EQUALITY_ASSERTION) {}
};
#define ASSERT_EQUALITY(a, b) \
{ \
VALUES<a, b>::AreEqual(compiler_message); \
}
int main() {
ASSERT_EQUALITY(1, 1) // a-okay
ASSERT_EQUALITY(1, 2) // ERROR!
}
Я получаю следующие ошибки компилятора:
no matching function for call to:
‘VALUES<1,2>::AreEqual(COMPILE_TIME_EQUALITY_ASSERTION&)'
candidate is:
static void VALUES<\A, B>::AreEqual(EQUAL_VALUES_ONLY_PLEASE) [with int A = 1, int B = 2]
комбинации статических функций-членов / конструкторов / назначения полей / конфиденциальности и спецификаций шаблонов могут привести к различным результатам, возможно, более подходящимдля вашей ситуации.