Скажем, у меня есть шаблонная функция, которая принимает переменные аргументы и вызывает другие функции с этими аргументами …
template<typename... A> func(int i, A... args)
{
// do something common
switch (i)
{
case 0: x(args...); break;
case 1: y(args...); break;
case 2: z(args...); break;
default: break;
}
// do something common
}
…а другие функции определены как …
void x(int a, int b);
void y(int a, int b); // note: takes same args as x()
void z(std::string a);
Это не компилируется, потому что вызов func () с аргументом std :: string не найдет совпадение для x () и y (), которое принимает аргумент std :: string.
Обратите внимание, что func () использует некоторые внешние критерии (значение параметра i в этом примере), чтобы решить, какой другой функции передать параметр аргументы.
Есть ли способ осуществить это, не прибегая к чему-то вроде заполнения аргументов параметров в std: tuple и передавая это?
[РЕДАКТИРОВАТЬ]Хорошо, я нашел подход, который работает достаточно хорошо для моих целей. Вот пример класса для иллюстрации …
class X
{
private:
bool a(int) { return true; }
bool b(int) { return true; }
template<typename... A> bool a(const A&...) { return false; }
template<typename... A> bool b(const A&...) { return false; }
public:
template<typename... A> void x(int i, const A&... args)
{
if (i == 0)
{
a(args...);
}
else
{
b(args...);
}
}
};
Методы шаблонов variadic для a () и b () будут перехватывать любые вызовы, сделанные в X.x (), где аргументы не являются единственными int. Это устраняет ошибку компилятора, которую я получаю, и включает более простой класс API, который я искал.
Да, сделать отдельные перегрузки:
template <typename A1>
func(A1 arg1)
{
x(arg1);
}
template <typename A1, typename A2>
func(A1 arg1, A2 arg2)
{
y(arg1, arg2);
}
template <typename A1, typename A2, typename A3>
func(A1 arg1, A2 arg2, A3 arg3)
{
z(arg1, arg2, arg3);
}
(Любой дополнительный общий код, конечно, может быть выделен в отдельную общую функцию, возможно, шаблон с переменной функцией.)
Посмотрите на этот пост, я знаю, что вы можете использовать ...
в качестве параметра, чтобы сказать, что вы используете переменное количество параметров.
Это еще один пример с хорошо прокомментированным кодом:
Функции со списками аргументов переменных в C и C ++ с использованием va_list
Надеюсь, это поможет.