Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.85/13: Рейтинг темы: голосов - 13, средняя оценка - 4.85
807 / 534 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1

Могут ли теоретически существовать методы с неопределенным числом аргументов?

01.08.2015, 19:49. Показов 3633. Ответов 47
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Разумно ли использовать va args в таких ситуациях?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
01.08.2015, 19:49
Ответы с готовыми решениями:

Функция с неопределенным количеством аргументов
Доброго времени суток! Каким образом можно в Delphi создать функцию с заранее неизвестным количеством аргументов? В качестве примера,...

Как отфильтровать сводную таблицу, если все критерии могут не существовать?
Есть код фильтра: With ActiveSheet.PivotTables("Сводная1").PivotFields("Отклонения") .PivotItems("2").Visible = False ...

Найти все возможные треугольники, которые могут существовать. Результат вывести на экран.
Функция которая по 3 десятичным числам проверяет, могут ли числа быть сторонами треугольника. C помощью массива (где строчка это стороны...

47
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
01.08.2015, 19:55
Теоретически - могут. В каких-таких ситуациях?
0
807 / 534 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
01.08.2015, 19:58  [ТС]
castaway
в таких ситуациях?
Да, пожалуй, это было лишним)
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
01.08.2015, 20:00
В С++11 появились Variadic Templates.
0
117 / 121 / 42
Регистрация: 25.08.2012
Сообщений: 1,294
01.08.2015, 23:24
Ferrari F1, разумеется могут. Только обязательно наличие первого параметра, а также от программиста требуется более-менее "угадать" типы аргументов. Пример - printf(const char* str ...). Из str она узнает не только о количестве аргументов, но и о их типе.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
02.08.2015, 14:46
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
Могут ли теоретически существовать методы с неопределенным кол-вом арг-ов?
А чем, по твоему, метод принципиально отличается от функции?
0
807 / 534 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
02.08.2015, 14:50  [ТС]
Evg, срашиваю из-за того, что считаю морально устаревшим использование древних средств языка вперемешку с классами. Мне это как минимум кажется неуместным
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
02.08.2015, 14:53
Попробуй написать что-то такое без использования va_arg'ов и стандартной библиотечной поддержки Си (т.е. на одних только "родных" технологиях Си++) и увидишь, что "из-за принципов" возникает много геморроя из ничего
cin cout и fscan fprintf
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
02.08.2015, 14:53
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
считаю морально устаревшим использование древних средств языка вперемешку с классами.
Так вариадики в помощь.
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
02.08.2015, 14:55
Цитата Сообщение от Evg Посмотреть сообщение
Попробуй написать что-то такое без использования va_arg'ов и стандартной библиотечной поддержки Си
Так ведь ответили уже:
Цитата Сообщение от 0x10 Посмотреть сообщение
В С++11 появились Variadic Templates.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
02.08.2015, 14:58
Цитата Сообщение от Tulosba Посмотреть сообщение
Так ведь ответили уже:
Напиши пример, если не сложно. А то я не очень представляю, как оно будет выглядеть
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
02.08.2015, 15:08
Цитата Сообщение от Evg Посмотреть сообщение
А то я не очень представляю, как оно будет выглядеть
Например, так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
 
template <class T>
void print(const T& item) {
    std::cout << item << std::endl;
}
 
template <class T, class... Args>
void print(const T& item, Args&&... args) {
    print(item);
    print(std::forward<Args>(args)...);
}
 
int main() {
    print(1, 'a', 3.1415);
}
2
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
02.08.2015, 15:14
Цитата Сообщение от 0x10 Посмотреть сообщение
Например, так:
Мне почему-то ближе такой вариант (с выводом в одну строку):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
 
void print() {
    std::cout << std::endl;
}
 
template <class T, class... Args>
void print(const T& item, const Args&... args) {
    std::cout << item << ' ';
    print(args...);
}
 
int main() {
    print(1, 'a', 3.1415);
}
1
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
02.08.2015, 15:33
При таком раскладе действительно нет смысла опускаться до уровня языка Си. Правда опять всё упирается в шаблонное программирование, когда в хидера выставляется много кода, но это уже другой вопрос
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
02.08.2015, 16:09
Цитата Сообщение от Evg Посмотреть сообщение
При таком раскладе действительно нет смысла опускаться до уровня языка Си.
Основной момент, это то что с variadic templates мы получаем проверку типов на стадии компиляции. Хотя, где-то я натыкался на упоминание того, что в GСС и printf сделали безопасным к типам.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
02.08.2015, 16:42
Цитата Сообщение от Tulosba Посмотреть сообщение
Хотя, где-то я натыкался на упоминание того, что в GСС и printf сделали безопасным к типам
Этого в принципе нельзя сделать. То, что сделано в gcc, это контроль со стороны компилятора в точке вызова printf'а при условии, что формат задан в виде строкового литерала. Понятно, что такими warning'ами накрывается 99% жизненных случаев, но это никак не технология безопасности. Между высоким уровнем (концепцией си++) и низким (концепция си) всегда есть соотношение: чем ниже уровень, тем меньше безопасности (в том смысле, что больше вещей перекладывается на программиста), но больше гибкости
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
02.08.2015, 20:50
Цитата Сообщение от Evg Посмотреть сообщение
но это никак не технология безопасности
А что же это тогда, если я явно получаю предупреждение в момент компиляции в случае несоответствия типов в формате и аргументов? Понятно, что это всё-таки предупреждение, а не ошибка, но дело тут в первую очередь именно в обнаружении ситуации на ранней стадии.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
02.08.2015, 23:40
В таком примере сия технология ничего не обнаружит

C
char *format = "%s";
...
printf (format, 1);
да и вытекает оно вовсе не из каких-то особенностей языка (как это имеет место быть в Си++), а из дополнительных необязательных возможностей компилятора. Да, она в 99% решит проблему. Но это только в компиляторе gcc, в других-то такого может и не быть. В то время как в Си++ все компиляторы отработают одинаково из-за свойств языка
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
03.08.2015, 09:06
Цитата Сообщение от Evg Посмотреть сообщение
В таком примере сия технология ничего не обнаружит
Потому что в таком примере обработка формата по сути выносится в run-time.
На сях вероятно стоило бы использовать #define, а не char* для обеспечения проверки в compile-time.
А вот на C++ правильно объявить указатель на строку формата:
C++
1
const char* const format = "%s";
После чего механизм проверки типов в printf снова вернется к работе во время компиляции.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
03.08.2015, 11:58
Цитата Сообщение от Tulosba Посмотреть сообщение
А вот на C++ правильно объявить указатель на строку формата
А кто тебе сказал, что форматная строка является константной? Она точно так же может генерироваться в runtime
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
03.08.2015, 11:58
Помогаю со студенческими работами здесь

Структура представления данных, где у родителя могут существовать более двух потомков
Как представить структуру в виде двоичного дерева, где у родителя могут существовать больше двух потомков. Необходимо подобрать...

Организовать цикл с неопределенным числом итераций
Здравствуйте, есть лист со списком имя(несколько раз подряд) и число в след стобце(неск раз подряд) Надо посчитать итого для каждого...

Функции с неопределенным числом фактических параметров
создать и отладить программу, которая осуществляет обработку элементов последовательности, вызывая функцию с неопределенным числом...

Вычислить функцию с неопределенным числом параметров
Требуется вычислить функцию y = max(a, b, c, ... ) где a, b, c, ... - целые числа а y - максимальное из этих чисел. Причем некоторые...

Вводится строка из нескольких слов и чисел,разделенных неопределенным числом пробелов
На форме 1 кнопка,1 надпись,1 едит и 1 мемо.Вводится строка из нескольких слов и чисел,разделенных неопределенным числом пробелов.Выбрать...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
Программный отбор значений справочника
Maks 21.03.2026
Установка программного отбора значений справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит предопределенное значение перечислений. Процедура. . .
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru