Передача аргументов в другую переменную функцию - PullRequest
0 голосов
/ 12 мая 2018

Можно ли вообще скомпилировать этот код и работать так, как задумано, не прибегая к 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;
}

Ответы [ 2 ]

0 голосов
/ 12 мая 2018

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

#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 голосов
/ 12 мая 2018

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

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

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

Нет: это то же самое, что

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

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

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

fct(1);

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

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

К примеру

template <typename ... Ts>
void fct(int index, Ts ... indexes)
{
    std::cout << index << ' ';
    fct(indexes...);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...