Могу ли я узнать, сколько аргументов получает моя функция? - PullRequest
0 голосов
/ 08 июня 2018

Учитывая функцию в c ++, есть ли способ получить количество аргументов, которое требуется моей функции?(например, argc на main на языке c).

Например:

double MyFunction(int x , int y) {   
    int NumOfParam= //.... =2;  
}    

Почему это было бы полезно для меня?
Например, я хочу написать функцию, которая вставляет все параметры функции вvector, и я подумал сделать это с for loop, который перебирает аргументы.

Например:

void MyFunction(int x,int y , int z){  
    std::vector<int> params;  
    for(int i=0; i< ?? ; i++) {  
        params.push_back("ArrayOfMyArguments[i]");
    }
}

Ответы [ 2 ]

0 голосов
/ 08 июня 2018

Мне кажется, что вы пришли из фона JavaScript, где все функции имеют массив arguments.C ++ не является JavaScript, и это невозможно.

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

  • пакеты параметров
  • std::initializer_list
  • Использование пар итераторов, если у вас есть последовательность из другого контейнера
  • C-стиль переменные функции (гдевам нужен специальный аргумент, чтобы указать количество переменных аргументов, или маркер «конца аргумента»)
  • или argc и argv подобное решение

Есливсе, что вам нужно сделать, это заполнить вектор, тогда я скорее рекомендую вам просто заполнить его напрямую, либо через цикл, когда и где это необходимо, либо через конструктор, принимающий std::initializer_list (как объяснено в одном из моих комментариев).

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

0 голосов
/ 08 июня 2018

То, что вам нужно, это шаблон-функция в сочетании с шаблонами переменных (a / k / a пакеты параметров) :

template<class ... Args>
void f(Args ... args)
{
    std::cout << sizeof...(args) << "\n";
}

int main()
{
    f(0, 1, 2); // prints 3
    f(0, 1, 2, 3, 4); // prints 5
}

Это обычно не то, что выбудет использовать по умолчанию.Рассмотрите возможность использования диапазонов:

template<class Iterator>
void f(Iterator begin, Iterator end)
{
    std::cout << std::distance(begin, end) << "\n";
}

, что более идиоматично.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...