Можно ли вообще скомпилировать этот код и работать так, как задумано, не прибегая к 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;
}
Я подозреваю, что вы неправильно поняли значение подписи
void fct (int index, int indexes...)
Я подозреваю, что вы думаете, что fct()
ожидать int
одно значение (index
) и список вариантов int
s (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...);
}
если ты действительно мне не нравится идея шаблона, я думаю, вы могли бы немного обмануть это так:
#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;
}