Вряд ли пользователь не хочет, чтобы за него меняли кодировку консоли.
reinterpret_cast<RefMemoryBlockBase*>(
reinterpret_cast<char*>(data) - sizeof(RefMemoryBlockBase)
)#define container_of(ptr, type, member) \
(reinterpret_cast<type*>( \
reinterpret_cast<char*>(ptr) - offsetof(type, member) \
))container_of(data, RefMemoryBlock , Value);
Я имел ввиду, что сам механизм уже есть, причем он стандартизирован (правда в Си, но и в плюсах его вполне можно использовать). На его основе вы можете сделать свой макрос или constexpr, содержащий логическое значение:
И далее уже использовать этот DEBUG, причем следить за правильностью его настройки в системе сборки уже не надо.
assert - к теме вопроса отношения не имеет, но на прямую имеет отношение к NDEBUG да и вообще инструмент полезный, многие его игнорируют, но я использую практически в каждой функции/методе. Если правильно расставить в ассерте инварианты на входе в функцию, то заметно облегчает отладку кода в случае возникновения ошибок. Кроме того, ассертом вы показываете читающему код коллеге какое состояние ожидает функция на входе.