Обычно способ решить эту проблему - перегрузка
template<typename T>
struct Outer {
template<int I>
void inner() {
inner(int_<I>());
}
private:
template<int I>
struct int_ { };
void inner(int_<0>) {
// for I == 0
}
template<int I>
void inner(int_<I>) {
// for others...
}
};
Это очень хорошо имитирует явные специализации и даже работает в тех случаях, когда проверка типа для других путей сходит с ума (в отличие от решения if
)
// ...
template<int I>
void inner(int_<I>) {
int tmp[I];
}
// ...
Это работает, потому что этот путь используется только если I != 0
. Теперь в вашем случае, я в первую очередь удивляюсь, почему вы просто не передаете нормальный аргумент функции. Похоже, что не требуется природа времени компиляции I
.
// works just fine too in your example
template<typename T>
void Holder<T>::saveReciprocalOf(int Number)
{
// Will this if-else-statement get completely optimized out
if(Number == 0) data = (T)0;
else data = (T)1 / Number;
}
Это также имеет хорошие шансы на оптимизацию, если компилятор встроит вызов функции. Использование нетипичного параметра шаблона, когда в этом нет особой необходимости, ограничивает возможности этой функции не работать со значениями времени выполнения.