Бесконечные аргументы метода одного типа - PullRequest
17 голосов
/ 04 января 2012

Я помню, что у меня где-то есть красный, что вы можете создать метод, который принимает бесконечные аргументы.Проблема в том, что я не помню, как это сделать.Я помню, что это было что-то вроде этого:

private void method(int arguments...)
{
//method body
}

Я уверен, что было "...".И я помню, что когда вы звоните method, вы можете назвать это так: method(3232); или method(123,23,12); Если кто-то понимает, о чем я говорю, скажите мне, как это сделать.

Ответы [ 3 ]

51 голосов
/ 04 января 2012

Вы бы использовали ключевое слово params :

private void method(params int[] arguments) 
{ 
    //method body 
}

Вы можете вызвать ваш метод следующим образом: method(1,2,3,4,5,6,7,8,9); и массив будет содержать эти числа. Ключевое слово params должно быть в массиве, и если оно не является единственным параметром в методе, оно должно быть последним. Только один параметр может иметь объявление param.

4 голосов
/ 04 января 2012

вы имеете в виду ParamArray? (для vb.net)

для c # кажется, что params

1 голос
/ 17 июля 2014

Вы ищете c / c ++ определение бесконечного числа аргументов функции.Вы можете увидеть здесь - http://www.cplusplus.com/reference/cstdarg/va_start/

Простой способ реализовать такую ​​функцию таков:

1 - определите вашу функцию, например

void logging(const char *_string, int numArgs, ...)

Первый аргументэто строка, которую вы хотите использовать.

Второй аргумент - это число бесконечных аргументов, которые вы хотите дать.Вам не нужно использовать этот параметр, если вы хотите подсчитать заполнители в переключателе (например,% d,% f в printf). Подсказка: в цикле получите каждый символ и посмотрите, является ли он вашим заполнителем -.

Я хочу привести вначале пример того, как вы могли бы вызвать такую ​​функцию:

logging("Hello %0. %1 %2 %3", "world", "nice", "to", "meet you"); // infinite arguments are "world", "nice", ... you can give as much as you want

Как видите, мои заполнители - это числа.Вы можете использовать все, что захотите.

2- Существуют макросы, которые инициализируют переменную списка и получают значение аргумента:

va_list arguments; // define the list
va_start(arguments, numArgs); // initialize it, Note: second argument is the last parameter in function, here numArgs

for (int x = 0; x < numArgs; x++) // in a loop
{ 
      // Note : va_arg(..) gets an element from the stack once, dont call it twice, or else you will get the next argument-value from the stack
      char *msg = va_arg(arguments, char *); // get "infinite argument"-value Note: Second parameter is the type of the "infinite argument".
      ... // Now you can do whatever you want - for example : search "%0" in the string and replace with msg
}
va_end ( arguments ); // we must end the listing

Если заменить каждый заполнитель на бесконечный аргументЗначения и распечатайте новую строку, вы должны увидеть это:

Hello world.приятно познакомиться

Надеюсь, это поможет ...

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