Я пишу функцию C ++, которая в данный момент получает параметр через шаблон. Функция сложная, но чтобы упростить вопрос, рассмотрим такую функцию:
template <int a> int foo(int b){
return a+b;
}
Но в финальной программе a
в вышеупомянутой функции будет известна во время выполнения (не во время компиляции), однако пользователь вынужден предоставить a
в диапазоне от 1 до 5. Другими словами, я могу не знать a
точно во время компиляции, но я уверен, что a
будет один из 1, 2, 3, 4 или 5.
Как я могу скомпилировать выше функцию 5 раз каждый для разных a
и во время выполнения выбрать, чтобы запустить правильный?
Одним из решений является определение разных версий foo
лайк foo_1
, foo_2
… составлен для разных a
s, но это, очевидно, увеличивает объем копируемого кода, особенно когда функция большая. Есть ли лучшее решение?
РЕДАКТИРОВАТЬ
Моя цель состоит в том, чтобы избежать что-то вроде ниже и есть switch
во время выполнения решения, какой из них использовать.
int foo_1(int b){
return 1+b;
}
int foo_2(int b){
return 2+b;
}
int foo_3(int b){
return 3+b;
}
int foo_4(int b){
return 4+b;
}
int foo_5(int b){
return 5+b;
}
Нечто подобное приходит на ум:
template <int a> int foo_impl(int b){
return a+b;
}
int (*foos[5])(int) = {
foo_impl<1>,
foo_impl<2>,
foo_impl<3>,
foo_impl<4>,
foo_impl<5>
};
int foo(int a, int b)
{
return (foos[a-1])(b);
}
Я надеюсь, что в вашем реальном коде есть реальная выгода для этого 🙂