Вариативный шаблон, вызывающий assert()

#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. Впечатляющий. Спасибо.