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

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

01.08.2015, 19:49. Показов 3663. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
Контроль уникальности заводского номера
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере нетипового документа выдачи шин для спецтехники с табличной частью, разработанного в конфигурации КА2. Данные берутся из. . .
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru