Утверждения для использования в контексте, как:Как реализовать отладочное утверждение runtime без макросов в C++ 11/14 с безопасностью типа?
ASSERT(dynamic_cast<Derived*>(_ptr));
ptr = static_cast<Derived*>(ptr);
Так во время отладки утверждения будет проверять динамическое приведение, но будет удалено в режиме выпуска. (стандартное утверждение)
Как реализовать это без макросов. Я подумал:
void ASSERT(bool _arg)
{
if(!_arg)
//something
}
Однако это не гарантирует безопасность типа. Кроме того, я думал о том, что у меня две реализации: пустая (для выпуска, поэтому функция ASSERT ничего не делает), а другая - с кодом выше для отладки. Этот метод также будет полагаться на компилятор, оптимизирующий пустую функцию, что не всегда является надежным.
Таким образом, что было бы лучшим способом? Или макросы абсолютно необходимы ...?
Я бы предпочел макрос, потому что он позволяет добавлять дополнительные данные, такие как '__LINE__' и' __FILE__', поэтому в случае ошибки вы точно знаете, где это происходит. Это невозможно сделать с помощью функции. – tomse
Рассмотрим следующий пример: 'ASSERT (f1() && f2() || f3())' - Я не уверен, будет ли компилятор оптимизировать вызов 'ASSERT' в этом случае и тем не менее fx() - вызовы функций остаются. С пустым макросом ничего не осталось ... – tomse