Могу ли я узнать, сколько аргументов получает моя функция?

Учитывая функцию в 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]");
    }
}
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
130
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

То, что вы ищете, - это шаблон функции в сочетании с вариативные шаблоны (пакеты параметров 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";
}

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

Обратите внимание, что пакет параметров - это конструкция C++ 11.

Jean-Baptiste Yunès 08.06.2018 10:11

Вопрос @ Jean-BaptisteYunès помечен как C++ 11;)

YSC 08.06.2018 10:12

Конечно, но такой вопрос позволяет мне, хотя OP не очень осведомлен обо всем этом. Но ты прав.

Jean-Baptiste Yunès 08.06.2018 10:14

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

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

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

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

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

Или пара Iterator first, Iterator last

Caleth 08.06.2018 10:18

Это более или менее, все в одном ответе.

JeJo 08.06.2018 11:31

Другие вопросы по теме