EDIT: В качестве примера я использовал случай if if else, который иногда может быть разрешен во время компиляции (например, когда задействованы статические значения, cf <type_traits>
). Адаптация ответов ниже для других типов статического ветвления (например, нескольких ветвей или ветвей с несколькими критериями) должна быть простой. Обратите внимание, что разветвление во время компиляции с использованием шаблона-мета-программирования не является темой здесь.
В типичном коде, подобном этому
#include <type_traits>
template <class T>
T numeric_procedure( const T& x )
{
if ( std::is_integral<T>::value )
{
// Integral types
}
else
{
// Floating point numeric types
}
}
будет ли компилятор оптимизировать выражение if/else, когда я буду определять конкретные типы шаблонов позже в моем коде?
Простой альтернативой было бы написать что-то вроде этого:
#include <type_traits>
template <class T>
inline T numeric_procedure( const T& x )
{
return numeric_procedure_impl( x, std::is_integral<T>() );
}
// ------------------------------------------------------------------------
template <class T>
T numeric_procedure_impl( const T& x, std::true_type const )
{
// Integral types
}
template <class T>
T numeric_procedure_impl( const T& x, std::false_type const )
{
// Floating point numeric types
}
Есть ли разница в производительности между этими решениями? Есть ли какие-либо субъективные основания говорить, что один лучше другого? Существуют ли другие (возможно, более эффективные) решения для разветвления во время компиляции?