2016-03-13 2 views
2

В питоне я могу сделать:C++ эквивалентно питона кода: 'функция (* список)'

def foo(a,b,c): 
    print a+b+c 

l=[5,2,10] 
foo(*l) 

Могу ли я сделать то же самое в C++?

+1

Это называется итерацией распаковкой; реализуйте его самостоятельно, это будет весело. – cat

+0

Наверное, не таким же, удобным способом, но вы все равно можете достичь того, что вам нужно. – Nard

ответ

2

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

Пример:

#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); 
} 

Как вы можете видеть, что это на самом деле не стоит свеч, хотя. Разный язык, разные идиомы.

-1

К сожалению, это невозможно с C++.

0

Это немного отличается на 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; 
} 
+0

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

+0

В SO не указывалось конкретно, что он/она не хочет определять несколько вариантов функции. Я считаю, что несправедливо говорить, что C++ не может сделать что-то, что Python может только потому, что C++ может делать это по-другому. – Nard

3

Я считаю, что ближайший эквивалентом является использование кортежа с (экспериментальным) применяется функция:

#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); 
} 
Смежные вопросы