2016-12-14 4 views
0

Если у меня есть некоторый код, как это:Избегайте если-нибудь заявление с шаблонной функцией

void function_1(...) 
{ 
    //do something 
} 


void function_2(...) 
{ 
    //do something 
} 


int function_3(...) 
{ 
    //do something 
} 

int main() 
{ 
    .... 
    if (CONSTANT_1) function_1() 
    else if (CONSTANT_2) function_2() 
    else if (CONSTANT_3) function_3() 
    ....  
} 

Я хотел бы избежать, если-нибудь заявления и сделать что-то вроде этого в главной функции:

int main() 
{ 
    function<CONSTANT>(); 
} 

Как я могу избежать использования инструкции if-else и моделировать это поведение?

+0

Нужно ли использовать шаблоны? Если нет, вы можете использовать карту констант и указателей функций. Затем вызовите функцию, которую вы получаете от карты для данной константы. – uptoNoGood

ответ

1

Перегрузка и отправка тегов. Базовый шаблон преобразует константу в уникальный тип. Тогда простое разрешение перегрузки выберет правильную перегрузку. Все это предполагает, что константа равна constexpr, а не что-то известное только во время выполнения.

void function(std::integral_constant<int, CONSTANT_1>) 
{ 
    //do something 
} 


void function(std::integral_constant<int, CONSTANT_2>) 
{ 
    //do something 
} 


int function(std::integral_constant<int, CONSTANT_3>) 
{ 
    //do something 
} 

template<int constant> 
auto function() 
{ 
    return function(std::integral_constant<int, constant>{}); 
} 

int main() 
{ 
    function<CONSTANT_2>(); // calls the second overload 
} 

выше имеет преимущество выдачи компиляции ошибки времени, когда перегрузка не найден, в отличие от ошибки сцепления, если вы специализируетесь шаблон функции вместо.

1

В общем, вы можете специализировать шаблон функции:

template<int N> 
void function(); 

template<> 
void function<1>() 
{ 
    //do something 
} 

template<> 
void function<2>() 
{ 
    //do something 
} 

template<> 
void function<3>() 
{ 
    //do something 
} 

Это работает, но может быть более эффективные решения, а также.

 Смежные вопросы

  • Нет связанных вопросов^_^