Утверждать динамическим сообщением?

В своей программе я хочу использовать утверждения, которые показывают сообщение об ошибке. Помимо хорошо известных обходных путей для C и C++, есть «настоящее» решение, которое предлагает BOOST BOOST_ASSERT_MSG( expr, msg )(. см. также assert ()с сообщением)

Но статического сообщения мне недостаточно, я также хочу иногда показывать неудачные переменные, например.в случае типа

BOOST_ASSERT_MSG( length >= 0, "No positive length found! It is " << length )

Как видите, я хотел бы отформатировать сообщение «строка» как stringstreamили ostream, так как это позволило бы мне легко отображать пользовательские типы (, предполагая, что я определил соответствующую функцию форматирования )..

Проблема здесь в том, что BOOST_ASSERT_MSGпо умолчанию требует char const *, так что это несовместимо.

Есть ли способ переопределить/перегрузить assertion_failed_msg()таким образом, чтобы использование потока в качестве сообщения работало? Как?
(Мой наивный подход потерпел неудачу, поскольку компилятор сначала хотел выполнить operator<<("foo",bar)для самого сообщения...)

10
задан Community 23 May 2017 в 12:01
поделиться