Если вы можете использовать C ++ 17 ... может быть, вы можете определить одну функцию с дополнительным параметром шаблона, который является номером функции, и использовать if constexpr
для разделения тел отдельных функций.
Я имею в виду что-то следующее
template <int Id, typename ... Pack>
void func (Pack ... params)
{
if constexpr ( 1 == id )
{ /* body of func1() */ }
else if constexpr ( 2 == id )
{ /* body of func2() */ }
else if constexpr ( 3 == id )
{ /* body of func3() */ }
// else // etc...
}
Для вызова func()
вам нужно явно указать целочисленный параметр шаблона
func<1>("abc"); // equivalent to func1("abc");
Как заметил Натан Оливер, когда имена функцийявляются важными и описательными (а не простыми перечислениями), использование целочисленного параметра шаблона дает вам полное описание.
В этом случае вместо int
вы можете добавить значение перечисления дополнительнопараметр шаблона. С описательными именами для значений enum.
Что-то вроде
enum funcId
{
a_complex_and_descriptive_func_id,
another_complex_func_id,
a_third_complex_func_id // , etc...
}
template <funcId Id, typename ... Pack>
void func (Pack ... params)
{
if constexpr ( a_complex_and_descriptive_func_id == id )
{ /* body of first function */ }
else if constexpr ( another_complex_func_id == id )
{ /* body of second function */ }
else if constexpr ( a_third_complex_func_id == id )
{ /* body of third function */ }
// else // etc...
}
и вызов становится
func<a_complex_and_descriptive_func_id>("abc");