Я ненавижу макросы. Я стараюсь не использовать их как можно чаще, но иногда они мне нужны для включения / отключения функций в моем коде. Как правило:
#ifdef THREAD_SAFE
typedef boost::mutex Mutex;
typedef boost::mutex::scoped_lock ScopedLock;
#else
typedef struct M { } Mutex;
typedef struct S { S(M m) { } } ScopedLock;
#endif
Таким образом, я могу оставить свой фактический код без изменений. Я доверяю компилятору удалить код плацебо, когда макрос не определен.
Я знаю, что специализация шаблонов могла бы быть решением, но это потребовало бы много переписывания / дублирования кода.
Не нужно быть экспертом по C ++, чтобы догадаться, что с моим изменением компилятора что-то не так. Я ищу лучшее решение.