Этот точный код не будет работать, потому что подстановка макросов происходит до создания экземпляра шаблона. Другими словами, к тому моменту, когда компилятор фактически начнет создавать экземпляр шаблона с аргументом N, препроцессор уже сделал свое условное включение. Более того, препроцессор не имеет семантического представления о том, что такое шаблон или что N является аргументом шаблона - он просто рассматривает N как токен препроцессора.
Если вы хотите получить этот эффект, вы можете использовать специализацию шаблона:
template <int N> union Vector
{
float e[ N ] ;
};
template <> union Vector<3>
float e[ 3 ] ;
float x, y, z;
} ;
template <> union Vector<2>
float e[ 2 ] ;
float x, y;
} ;
Надеюсь, это поможет!