Как написать универсальную или гибкую функцию, которая могла бы принимать любое количество параметров для выполнения на них указанной задачи? - PullRequest
3 голосов
/ 30 апреля 2019

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

Пример:

#include <iostream>
int add(int x, int y);

int main()
{
    std::cout << "3 + 4 + 5 = " << add(3, 4) << '\n';
    return 0;
}

int add(int x, int y, int z)
{
    return x + y + z;
}

Не связывает. Компилятор будет соответствовать заранее объявленному прототипу add для вызова функции add () в main (). Однако функция add (), которая принимает два параметра, никогда не была реализована (мы реализовали только одну функцию, которая приняла 3 параметра), поэтому компоновщик будет жаловаться. ожидаемый результат состоит в том, что функция не сталкивается с этой проблемой, без необходимости каждый раз писать разные функции для разных наборов параметров, чтобы выполнять над ними операции.

Ответы [ 2 ]

7 голосов
/ 30 апреля 2019

вам нужно определить 2 экземпляра вашей add() функции: один шаблонизированный вариант и один для прекращения развертывания аргументов;

int add(int x) { return x; }        // to terminate templated add

template<typename... Args>
int add(int first, Args... rest)    // to unroll args
 { return first + add(rest...);  }

int main()
{
    std::cout << "3 + 4 = " << add(3, 4) << '\n';
    std::cout << "3 + 4 + 5 = " << add(3, 4, 5) << '\n';
    return 0;
}

Вывод:

3 + 4 = 7
3 + 4 + 5 = 12

вам потребуетсяc ++ 11 или выше для этого решения.

1 голос
/ 30 апреля 2019

Поскольку OP упомянул, что он использует C ++ 17, существует более простой способ сделать это, используя сложенные выражения :

#include <iostream>

template<typename... Args>
auto add(Args... args)
{ 
    return (args + ...);
}

int main()
{
    std::cout << "3 + 4 = " << add(3, 4) << '\n';
    std::cout << "3 + 4 + 5 = " << add(3, 4, 5) << '\n';
    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...