Передача аргументов в другую переменную функцию

Можно ли вообще скомпилировать этот код и работать так, как задумано, не прибегая к va_list вещи?

#include <iostream>

void fct(void)
{
std::cout << std::endl;
}

void fct(int index, int indexes...)
{
std::cout << index << ' ';
fct(indexes); //or fct(indexes...); ?
}

int main(void)
{
fct(1, 2, 3, 4, 5, 6, 7);
return 0;
}

4

Решение

Я подозреваю, что вы неправильно поняли значение подписи

void fct (int index, int indexes...)

Я подозреваю, что вы думаете, что fct() ожидать int одно значение (index) и список вариантов ints (indexex...) в C ++ 11 стиле расширения пакета параметров.

Нет: это так же, как

void fct (int index, int indexes, ...)

так два int отдельные значения и C-стиль необязательного аргумента, который вы можете использовать только через va_list вещи.

Если вы не верите, попробуйте позвонить fct() только с целочисленным аргументом

fct(1);

Вы должны получить ошибку типа «error: нет подходящей функции для вызова функции fct» с примечанием типа «note: функция-кандидат недопустима: требуется как минимум 2 аргумента, но был предоставлен 1» относительно вариационной версии fct(),

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

Примером

template <typename ... Ts>
void fct(int index, Ts ... indexes)
{
std::cout << index << ' ';
fct(indexes...);
}
2

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

если ты действительно мне не нравится идея шаблона, я думаю, вы могли бы немного обмануть это так:

#include <iostream>
#include <vector>

void fct(std::vector<int>&& _indices)
{
for (auto&& i : _indices)
{
std::cout << i << ' ';
}
std::cout << std::endl;
}

int main(void)
{
fct({1, 2, 3, 4, 5, 6, 7}); // Note the curly braces
return 0;
}
0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector