Использование времени выполнения if
- плохая идея, потому что все уже известно для времени компиляции. Именно поэтому C ++ ввел constexpr if
для упомянутого вами случая. constexpr if
нужен компилятор, совместимый с c ++ 17, что должно быть в 2018 году: -)
template <typename T>
void func(T ) {
std::cout << "common before" << std::endl;
if constexpr (std::is_same<T, int>::value) {
std::cout << "int" << std::endl;
} else if constexpr (std::is_same<T, double>::value) {
std::cout << "double" << std::endl;
} else {
std::cout << "other" << std::endl;
}
std::cout << "common after" << std::endl;
}
int main()
{
func(1);
func(1.1);
func('a');
}
Но есть один момент, о котором вы должны упомянуть: если у вас есть большая «общая» часть в вашей шаблонной функции, не имеет значения, специализация шаблона или constexpr if
, вы получаете полную копию этого кода для каждого шаблона. пример. Поэтому неплохо было бы переместить этот код в функцию, чтобы получить общую часть только один раз. Если компилятор считает, что встраивание этого кода является хорошим выбором, он сделает это, и вы получите лучшее из обоих решений.