#c #templates #assert
#c #шаблоны #утверждать
Вопрос:
У меня есть этот код:
#ifdef _DEBUG #define MY_VERY_SPECIAL_ASSERT(x, ...) assert(x amp;amp; __VA_ARGS__) #else #define MY_VERY_SPECIAL_ASSERT(x, ...) #endif
что делает именно то, что должно. Но, стремясь продолжать учиться вечно, я стараюсь следовать рекомендациям по constexpr
вариативным шаблонам из набора core-cpp.
Я попробовал несколько перестановок, но эта кажется наиболее «правильной».
#ifdef _DEBUG templatelt;typename Tgt; constexpr void MY_VERY_SPECIAL_ASSERT(T x, const std::string amp;msg) { assert(x amp;amp; msg); } #else templatelt;typename Tgt; constexpr void MY_VERY_SPECIAL_ASSERT(T x, const std::string amp;msg) { } #endif
Но, конечно, он не хочет компилироваться. В частности, нет логической перегрузки и перегрузки для «T» и строки, что в некотором роде имеет смысл. Ты бы подумал, что это всегда будет правдой, верно?
В любом случае, если у кого-нибудь есть какие-либо указания здесь, я буду рад узнать больше о шаблонах. =)
Комментарии:
1. Понятия не имею, что должен делать код! Вы хотите проверить наличие условия и прервать выполнение, но предварительно вывести сообщение?
2. Это оно. Я часто видел
assert([test] amp;amp; "msg")
, как его использовали.
Ответ №1:
T
является a bool
, а именно результатом вычисления выражения E1
с
static_castlt;decltype (E1)gt; (false) != E1;
Вы получаете ошибку, потому std::string
что не имеет неявного преобразования в bool
.
constexpr void MY_VERY_SPECIAL_ASSERT(T x, const std::string amp;msg) { // assert(x amp;amp; static_castlt;boolgt;(msg)); // won't work assert(x amp;amp; msg.empty()); // Should work. The string won't be displayed when an assertion fails, though. }
Но в любом случае это не сделает того, о чем можно было бы подумать.
assert(x amp;amp; msg);
Всегда будет отображаться сообщение «Ошибка утверждения: x amp;amp; msg». Вы можете использовать это вместо этого:
assert ( false or !"message" ); #ifndef _DEBUG # define SPECIAL_ASSERT(...) () #else # define SPECIAL_ASSERT(COND, MSG) (assert(COND or! MSG)) #endif SPECIAL_ASSERT( 1 == 0, "One isn't zero." );
Комментарии:
1. Впечатляющий. Спасибо.