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

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

01.08.2015, 19:49. Показов 3631. Ответов 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
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
03.08.2015, 12:10
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Evg Посмотреть сообщение
Она точно так же может генерироваться в runtime
Может. Но когда я первый раз упомянул printf gcc'шный в этой теме речь шла именно про compile-time (сообщение #15).
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
03.08.2015, 12:14
Так потому я и говорю, что это не технология безопасности, а поделка. Она в большинстве жизненных случаев поймает пользователя за руку. Но не всегда. И не на всех компиляторах. В то время как подход Си++ попросту не даст возможности пользователю выстрелить себе в ногу. Но платой за это является потеря гибкости при работе и навязанная необходимость всё делать через шаблоны и огромное количество кода в хидерах
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
03.08.2015, 12:17
Цитата Сообщение от Tulosba Посмотреть сообщение
const char* const format = "%s";
граммар конст?
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
03.08.2015, 12:17
Думается, для условного my_printf (которая не обязательно занимается печатью) с динамически сгенерированной форматной строкой для Си++ вменяемого аналога нет (как в своё время не было variadic template'ов). Пока это не будет статистически значимым, в Си++ никто не будет чего-то вносить по этому поводу. Но если вдруг понадобится, то может и придумают очередную монстровую конструкцию
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
03.08.2015, 13:03
Цитата Сообщение от hoggy Посмотреть сообщение
граммар конст?
Да, чтоб сообщение компилятора получить.
Цитата Сообщение от Evg Посмотреть сообщение
это не технология безопасности, а поделка.
Тут, имхо, вопрос терминологии. Что считать "технологией", а что нет.
Например, если поделку стандартизировать, будет ли она считаться технологией по твоему мнению?
Я тут не делал различий, наверное поэтому фраза
Цитата Сообщение от Evg Посмотреть сообщение
но это никак не технология безопасности.
меня и смутила.
1
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
03.08.2015, 13:10
Цитата Сообщение от Tulosba Посмотреть сообщение
Например, если поделку стандартизировать, будет ли она считаться технологией по твоему мнению?
Я уже писал выше о том, что этого в принципе сделать невозможно. Потому что форматная строка может быть сгенерирована в runtime. А потому оно так и останется на всегда доброй волей разработчиков компилятора, а никак не стандартом.

Да и работает оно, строго говоря, некорректно. Если подать формат %d, а значение подавать типа unsigned, то с точки зрения стандарта код некорректен, но по факту такая комбинация используется широко и повсеместно, из-за чего gcc'шники в подобных случаях предупреждения не выдают

C
1
2
3
4
5
6
7
#include <stdio.h>
 
void foo (unsigned x)
{
  printf ("%d\n", x);
  printf ("%ld\n", x);
}
Code
$ gcc t.c -c -Wall
t.c: In function 'foo':
t.c:6:3: warning: format '%ld' expects argument of type 'long int', but argument 2 has type 'unsigned int' [-Wformat=]
   printf ("%ld\n", x);
т.е. обе строки формально некорректны, но предупреждение выдаётся только на вторую

В технологиях, используемых в Си++ невозможно отвязать значение от типа, а потому подобные моменты там в принципе возникнуть не могут. Поэтому вариант из Си++ уже тянет на то, чтобы назвать его словом "технология"
0
 Аватар для Voivoid
710 / 283 / 16
Регистрация: 31.03.2013
Сообщений: 1,340
03.08.2015, 14:24
Цитата Сообщение от Evg Посмотреть сообщение
Но платой за это является потеря гибкости при работе
Если ты про форматную строчку, то её точно так же можно использовать и с variadic template'ами. Код немного посложнее конечно будет
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
03.08.2015, 14:41
Касательно вариадиков, помните, что можно все делать без рекурсии.

C++
1
2
3
4
5
6
7
template<typename... Args>
void print(const Args&... args)
{
   using swallow = int[];
   swallow{0, (std::cout << args << ' ', void(), 0)...};
   std::cout << std::endl;
}
7
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
03.08.2015, 15:17
Цитата Сообщение от Tulosba Посмотреть сообщение
Да, чтоб сообщение компилятора получить.
значит это и сегодня тоже актуально)
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
03.08.2015, 15:19
Цитата Сообщение от Voivoid Посмотреть сообщение
Если ты про форматную строчку
Я, например, про то, что я вот хочу иметь функцию в отдельном файле *.c (*.cc) и в хидере иметь только extern-описание функции. Идеология шаблонов Си++ накладывает ограничение в виде того, что так я сделать не могу
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
03.08.2015, 16:05
немного упростил и доработал вариант ForEveR:
C++
1
2
3
4
5
6
7
template<typename... Args>
void print(const Args&... args)
{
    using swallow = int[];
    static_cast<void>( swallow{ (std::cout << args << ' ', 0)... } );
    std::cout << std::endl;
}
Добавлено через 10 минут
Ну, и минус такой версии, что не работает с нулевым кол-вом параметров.
3
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
03.08.2015, 16:08
Цитата Сообщение от Tulosba Посмотреть сообщение
Ну, и минус такой версии, что не работает с нулевым кол-вом параметров.
Ну так.., а кому нужна версия с нулевым количеством параметров?) С одной стороны это даже плюс.
0
 Аватар для DiffEreD
1458 / 795 / 257
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
03.08.2015, 16:09
Tulosba, а зачем здесь static_cast<void> ?
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
03.08.2015, 23:06
Цитата Сообщение от DiffEreD Посмотреть сообщение
а зачем здесь static_cast<void> ?
Чтобы подавить предупреждение компилятора:
warning: expression result unused
Добавлено через 2 минуты
Цитата Сообщение от castaway Посмотреть сообщение
а кому нужна версия с нулевым количеством параметров?)
Ну, это как факториал нуля Для полноты картины.

Добавлено через 18 минут
Короче, я сам продаунгрейдил функцию при "оптимизации" В исходном варианте возможность вызова с нулевым кол-вом аргументов была. Возвращаю:
C++
1
2
3
4
5
6
7
template<typename... Args>
void print(const Args&... args)
{
    using swallow = int[];
    static_cast<void>( swallow{ 0, (std::cout << args << ' ', 0)... } );
    std::cout << std::endl;
}
Добавлено через 44 минуты
Могу ещё такой вариант предложить:
C++
1
2
3
4
5
6
template<typename... Args>
void print(const Args&... args)
{
    int dummy[]{ 0, (std::cout << args << ' ', 0)... };
    std::cout << std::endl;
}
И вот ещё почитайте кому интересно.

Добавлено через 5 часов 39 минут
Цитата Сообщение от Evg Посмотреть сообщение
т.е. обе строки формально некорректны, но предупреждение выдаётся только на вторую
Как я понимаю, защита в первую очередь направлена на исключение ситуаций с разными размерами данных (в байтах). Собственно поэтому на %d не ругается при использовании unsigned аргумента, так же как и на %o (или %x) не будет ругаться при использовании знакового int'а. А вот когда длина данных не совпадает с форматом, тогда ошибка наиболее очевидна.
5
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
04.08.2015, 08:38
Цитата Сообщение от Tulosba Посмотреть сообщение
Как я понимаю, защита в первую очередь направлена на исключение ситуаций с разными размерами данных (в байтах)
Подсунь вместо unsigned данные типа float, которые того же размера и будет совсем всё по другому. А реальная причина в том, что некорректные коды используются повсеместно и либо пользователи взвыли от такой функциональности, либо они уже на этапе тестирования это поняли, а потому часть "защиты" сняли. Кстати, в режиме, когда размеры int'а и long'а совпадают, предупреждение всё равно есть, хотя номинально код отработает без ошибок

Добавлено через 3 минуты
А то множество возможностей написания кода на Си++ в общем-то показывает ущербность той технологии, по которой пошли в Си++. Вместо простого программирования начинаются соревнования на тему как лучше это записать в Си++. Но зато надёжность (строгая типизация)
1
 Аватар для Voivoid
710 / 283 / 16
Регистрация: 31.03.2013
Сообщений: 1,340
04.08.2015, 13:00
Цитата Сообщение от Evg Посмотреть сообщение
Я, например, про то, что я вот хочу иметь функцию в отдельном файле *.c (*.cc) и в хидере иметь только extern-описание функции
Да какая разница, разве что компиляции подольше будет, но и на этот случай precompiled headers есть.

Цитата Сообщение от Evg Посмотреть сообщение
А то множество возможностей написания кода на Си++ в общем-то показывает ущербность той технологии, по которой пошли в Си++
Круто, что тут сказать, наличие множества возможностей это теперь считается ущербностью. О времена, о нравы
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
04.08.2015, 14:13
Tulosba, Там void() не спроста был в принципе, как подсказали товарищи на SO.) (здесь оно конечно не нужно, но в целом может пригодиться) http://stackoverflow.com/quest... 0#31743450
1
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
04.08.2015, 15:01

Не по теме:

Цитата Сообщение от ForEveR Посмотреть сообщение
как подсказали товарищи на SO.
Сначала я несколько удивился как это ты за 2 минуты такой пост накатал ... а потом я увидел список ревизий :)

Цитата Сообщение от ForEveR Посмотреть сообщение
здесь оно конечно не нужно
Хорошо всё-таки, что перегружать можно не все подряд операторы.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
04.08.2015, 16:45
Цитата Сообщение от Voivoid Посмотреть сообщение
Да какая разница
Я вот захочу поставить библиотеку с закрытым кодом. Я выставлю хидер, а код люди видеть не будут. На Си++ такой возможности попросту не будет. Ты можешь это считать чем угодно, я считаю это отсутствием гибкости и навязыванием способов проектирования

Цитата Сообщение от Voivoid Посмотреть сообщение
но и на этот случай precompiled headers есть
Если ты считаешь, что это принципиально ускорит процесс сборки, значит ты слабо понимаешь, как работает компилятор

Цитата Сообщение от Voivoid Посмотреть сообщение
Круто, что тут сказать, наличие множества возможностей это теперь считается ущербностью
Видимо, ты либо плохо читаешь, либо не вникаешь. Посмотри мой вариант на Си, где по простому написано то, что я хочу. Посмотри варианты на Си++, где один вариант извращённее другого (как следствие "множества возможностей"). Опять-таки ты можешь считать это чем угодно, но я считаю это ущербностью языка. Потому что когда нужно сделать что-то простое, а приходится делать сложно (зато на чистом Си++, правда на одном из поздних стандартов) - лично мне это не нравится
0
 Аватар для Voivoid
710 / 283 / 16
Регистрация: 31.03.2013
Сообщений: 1,340
04.08.2015, 17:07
Цитата Сообщение от Evg Посмотреть сообщение
Посмотри мой вариант на Си, где по простому написано то, что я хочу. Посмотри варианты на Си++, где один вариант извращённее другого
В этой теме от тебя был только кусочек кода с примером использования C'шного printf. Ты что с чем сравниваешь-то? Использование функции с её реализацией? Типа смотрите как легко на С использовать printf и как сложно на ущербном C++ реализовать типобезопасный printf. Так что-ли?

Цитата Сообщение от Evg Посмотреть сообщение
Потому что когда нужно сделать что-то простое, а приходится делать сложно (зато на чистом Си++, правда на одном из поздних стандартов) - лично мне это не нравится
Ну тогда у тебя наверняка найдется пример более простой реализации типобезопасного printf'а. Да, можно на любом языке.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
04.08.2015, 17:07
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Переходник 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
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru