Передача переменных аргументов в шаблоне переменных C ++

Скажем, у меня есть шаблонная функция, которая принимает переменные аргументы и вызывает другие функции с этими аргументами …

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, который я искал.

0

Решение

Да, сделать отдельные перегрузки:

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);
}

(Любой дополнительный общий код, конечно, может быть выделен в отдельную общую функцию, возможно, шаблон с переменной функцией.)

2

Другие решения

Посмотрите на этот пост, я знаю, что вы можете использовать ... в качестве параметра, чтобы сказать, что вы используете переменное количество параметров.

… синтаксис в C ++

Это еще один пример с хорошо прокомментированным кодом:
Функции со списками аргументов переменных в C и C ++ с использованием va_list

Надеюсь, это поможет.

0

По вопросам рекламы [email protected]