Я считаю, что то, что вы хотите, является эквивалентом команды "static if", которая существует на языке D. Я боюсь, что такая функция не существует в C ++.
Обратите внимание, что если части вашего кода различаются в зависимости от функции, которую вы запрашиваете, эти части не входят в основную функцию, потому что они не являются частью простого алгоритма. Так что возможность делегировать такие функции в функциях кажется хорошей.
EDIT
Если ваши операторы #ifdef используются для выполнения одной и той же подзадачи по-разному, то определение подфункций является правильным решением. Это сделает ваш код более читабельным, а не менее.
Если они используются для совершенно разных действий, ваш код уже загроможден. Сделай что-нибудь с этим.
Что касается проблемы с производительностью, которая, как вы опасаетесь, может возникнуть, поверьте компилятору.
EDIT2
Я забыл упомянуть ответ на первую часть вашего кода: используйте следующий трюк для добавления или удаления членов в зависимости от «функции».
namespace helper
{
template<int feature>
struct A;
template<>
struct A<0> { // add member variables for case 0 };
template<>
struct A<1> { // add member variables for case 1 };
}
template<int feature>
class A : private helper::A<feature>
{
// ... functions here
};