http://erdani.com/index.php/books/modern-c-design/errata/ Page 25:Понимать во время компиляции Assertions
template<bool> struct CompileTimeChecker
{
CompileTimeChecker(...);
};
template<> struct CompileTimeChecker<false> {};
#define STATIC_CHECK(expr, msg) \
{ \
CompileTimeError<expr> \
ERROR_##msg; \
(void)ERROR_##msg; }
template<class To, class From>
To safe_reinterpret_cast(From from)
{
STATIC_CHECK(sizeof(From) <= sizeof(To),
Destination_Type_Too_Narrow);
return reinterpret_cast<To>(from);
}
int main(int argc, _TCHAR* argv[])
{
//STATIC_CHECK(true,
// Destination_Type_Too_Narrow);
double d = 1.0;
int* i = safe_reinterpret_cast<int*>(&d);
return 0;
}
Вопрос 1> Почему компилятор жалуется на использование Destination_Type_Too_Narrow
?
Ошибка 4 Ошибка C2065: 'ERROR_Destination_Type_Too_Narrow': необъявленная идентификатор
Вопрос 2> Почему мы должны всегда использовать бросок (void)
в макросе? Чтобы избежать предупреждения об неиспользованной переменной?
Вопрос 3> Почему STATIC_CHECK (false, XXX) вызовет ошибку компиляции?
Спасибо
Надеюсь, вы знаете о ['static_assert'] (http://en.cppreference.com/w/cpp/keyword/static_assert)? – rubenvb
VS2013 поддерживает ['static_assert'] (https://msdn.microsoft.com/en-us/library/vstudio/dd293588.aspx), есть ли причина, по которой вы ее не используете? 'static_assert (sizeof (To)> = sizeof (From)," Destination Type Too Narrow ");' –
@RemyLebeau, нужно понимать концепцию и теорию – q0987