807 / 534 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1

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

01.08.2015, 19:49. Показов 3857. Ответов 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
21282 / 8307 / 637
Регистрация: 30.03.2009
Сообщений: 22,669
Записей в блоге: 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
21282 / 8307 / 637
Регистрация: 30.03.2009
Сообщений: 22,669
Записей в блоге: 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
21282 / 8307 / 637
Регистрация: 30.03.2009
Сообщений: 22,669
Записей в блоге: 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
21282 / 8307 / 637
Регистрация: 30.03.2009
Сообщений: 22,669
Записей в блоге: 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
21282 / 8307 / 637
Регистрация: 30.03.2009
Сообщений: 22,669
Записей в блоге: 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
21282 / 8307 / 637
Регистрация: 30.03.2009
Сообщений: 22,669
Записей в блоге: 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
Ответ Создать тему
Опции темы

Новые блоги и статьи
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru