Шаблон позволяет факторизовать этот вид кода, а C ++ 17 позволяет его чисто с if constexpr
:
template<bool b>
void f(int x, float y, char *z)
{
// ...
if constexpr (b)
{
// ...
}
else
{
// ...
}
// ...
}
// if you still need runtime dispatch
void f(int x, float y, char *z, bool b)
{
return b ? f<true>(x, y, z) : f<false>(x, y, z);
}
Без if constexpr
, нет гарантии, что во время выполнения ветвления нет, но компилятор может легко сделать это нормально.Поэтому, если вы хотите получить эту гарантию до C ++ 17, вы должны специализировать расходящуюся деталь
по специализации:
template <bool b> void f_impl(..);
template <> void f_impl<true>(..) { /*..*/ }
template <> void f_impl<false>(..) { /*..*/ }
template<bool b>
void f(int x, float y, char *z)
{
// ...
f_impl<b>(..);
// ...
}
илиотправка тегов:
void f_impl(std::true_type, ..) { /*..*/ }
void f_impl(std::false_type, ..) { /*..*/ }
template<bool b>
void f(int x, float y, char *z)
{
// ...
f_impl(std::integral_constant<bool, b>{}..); // std::bool_constant<b> in C++17
// ...
}