Как передать массив вместо аргументов?

Хочу сделать что-то вроде
int f(int a, int b){
    return a+b;
}

int f(vector<int> v){
    if (v.size()!=expected_size) throw std::runtime_error("Invalid args count");
    //copy v to args and call f(int,int)
} 

int main()
{
    int expected_size = 2;
    std::vector<int> a{1,2}; //size of vector==expected_size
    f(a); //тоже, что и f(1,2)
    return 0;
}

Как скопировать подставить содержимое вектора вместо аргументов,а потом вызвать функцию?
  • Вопрос задан
  • 122 просмотра
Решения вопроса 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
Если я правильно понял вопрос, то наиболее похожее из того что мне известно -- это семейство функций getcontext/makecontext/setcontext/swapcontext и __builtin_apply. И то и другое -- не готовое решение, с форматом передаваемого участка памяти прийдётся разбираться, а __builtin_apply определённо завязано на архитектуру и ABI и это gcc-specific.

Но я думаю, что это неправильный подход к решению и вообще сам вопрос -- неправильный подход к решению. Если ты пишешь транслятор, то для функций с фиксированным набором аргументов ты можешь тупо сгенерировать код вызова функции удовлетворяющий всем правилам C++.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
wataru
@wataru Куратор тега C++
Разработчик на С++, экс-олимпиадник.
Не совсем поятно, что вы хотите сделать.

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

void f(const std::vector<int> &arg){
}
f({1,2,3});


И да, массив не в квадратных скобках задается, а в фигурных.
Передача по ссылке, чтобы не копировать эти все значения лишний раз. Для трех элементов погоды почти не делает, но если их 100, или тем более 1000 - это заметная оптимизация. const, чтобы можно было передавать временные объекты. Плюс так понятно, что это аргументы входные и вы их менять в функции не будете.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы