В питоне я могу сделать:C++ эквивалентно питона кода: 'функция (* список)'
def foo(a,b,c):
print a+b+c
l=[5,2,10]
foo(*l)
Могу ли я сделать то же самое в C++?
В питоне я могу сделать:C++ эквивалентно питона кода: 'функция (* список)'
def foo(a,b,c):
print a+b+c
l=[5,2,10]
foo(*l)
Могу ли я сделать то же самое в C++?
Ближайшие вы можете получить это создание пользовательского типа с переменными-членами для каждого аргумента, и перегрузить функцию принимать либо отдельные значения или пользовательский тип. Вторая перегрузка затем вызывает первое.
Пример:
#include <iostream>
void foo(int a, int b, int c)
{
std::cout << a + b + c << "\n";
}
struct foo_args { int a; int b; int c; };
void foo(foo_args const& args)
{
foo(args.a, args.b, args.c);
}
int main()
{
foo_args const l { 5, 2, 10 };
foo(l);
}
Как вы можете видеть, что это на самом деле не стоит свеч, хотя. Разный язык, разные идиомы.
К сожалению, это невозможно с C++.
Это немного отличается на C++, но я считаю, что вы все равно можете делать то, что хотите.
#include <iostream>
#include <vector>
void foo(int a, int b, int c) {
std::cout << a + b + c << std::endl;
}
void foo(const int (&arr)[3]) { //foo overloaded for arrays of size 3
foo(arr[0], arr[1], arr[2]); //Calls the original foo
}
void foo(const std::vector<int>& v) { //foo overloaded for vectors
if(v.size() >= 3) //Vector should at least have 3 elements
foo(v[0], v[1], v[2]); //Calls the original foo
}
int main(void) {
foo(10, 20, 30);
int arr[3] {40, 50, 60};
foo(arr);
std::vector<int> v {70, 80, 90};
foo(v);
getchar();
return 0;
}
На самом деле это не распаковка, что вы здесь делаете, вам нужно определить несколько функций. Я полагаю, что SO хочет передать массив функции, которая принимает несколько параметров, без необходимости определять варианты функций. – Rafid
В SO не указывалось конкретно, что он/она не хочет определять несколько вариантов функции. Я считаю, что несправедливо говорить, что C++ не может сделать что-то, что Python может только потому, что C++ может делать это по-другому. – Nard
Я считаю, что ближайший эквивалентом является использование кортежа с (экспериментальным) применяется функция:
#include <tuple>
#include <iostream>
#include <experimental/tuple>
using std::cout;
using std::make_tuple;
using std::experimental::apply;
int main()
{
auto foo = [](int a,int b,int c)
{
cout << a+b+c << "\n";
};
auto l = make_tuple(5,2,10);
apply(foo,l);
}
Это называется итерацией распаковкой; реализуйте его самостоятельно, это будет весело. – cat
Наверное, не таким же, удобным способом, но вы все равно можете достичь того, что вам нужно. – Nard