Кто-нибудь пробовал последовательно последовать совету заменять условную компиляцию/макросы шаблонами/инлайнами/компилероассертами? И если да - насколько последовательно (удалось ли совсем-совсем воздержаться от макросов/костылей препроцессора, окромя #include/прагм/хедердружинников). Есть, конечно, конструкция
template<bool Condition>
struct IF { typedef... };
template<> struct IF<true> { blah-blah-blah };
есть всякоразные
template<...> struct X { enum { Feature = constexpr ? x : y }; };
а есть
__COUNTER__, __FILE__ и __LINE__. Примеры адекватной замены в студию :) Еще вариант: компайл-тайм выбор платформы без использования «#if (UNIX || LINUX)» (то есть, понятно, что можно политики/фабрики, а можно ли совсем без #if[[n]def], спрятанных под политиками/фабриками?)
Фибоначей с факториалами не предлагать (как трюк прикольно, но практически неинтересно: теоретики на кухне любят метавычислениями заниматься - слово за слово, факториалом по столу... Интересует практика внедрения в жизнь «у станка»). Либеральный constexpr из Сxx11 тоже :)))