Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
 
Ferrari F1
Заблокирован
295 / 281 / 61
Регистрация: 27.01.2015
Сообщений: 1,888
Записей в блоге: 1
Завершенные тесты: 1
01.08.2015, 19:49     Могут ли теоретически существовать методы с неопределенным числом аргументов? #1
Разумно ли использовать va args в таких ситуациях?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.08.2015, 19:49     Могут ли теоретически существовать методы с неопределенным числом аргументов?
Посмотрите здесь:

Функции с переменным числом аргументов C++
Шаблоны с переменным числом аргументов C++
Есть функция с кучей аргументов, как её вызвать в другой функции (если половины аргументов у меня нет)? C++
C++ Шаблон с переменным числом аргументов, и возвращаемое значение функции
C++ Инициализация std::tuple переменным числом аргументов
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
03.08.2015, 12:10     Могут ли теоретически существовать методы с неопределенным числом аргументов? #21
Цитата Сообщение от Evg Посмотреть сообщение
Она точно так же может генерироваться в runtime
Может. Но когда я первый раз упомянул printf gcc'шный в этой теме речь шла именно про compile-time (сообщение #15).
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16824 / 5245 / 319
Регистрация: 30.03.2009
Сообщений: 14,121
Записей в блоге: 26
03.08.2015, 12:14     Могут ли теоретически существовать методы с неопределенным числом аргументов? #22
Так потому я и говорю, что это не технология безопасности, а поделка. Она в большинстве жизненных случаев поймает пользователя за руку. Но не всегда. И не на всех компиляторах. В то время как подход Си++ попросту не даст возможности пользователю выстрелить себе в ногу. Но платой за это является потеря гибкости при работе и навязанная необходимость всё делать через шаблоны и огромное количество кода в хидерах
hoggy
5114 / 2115 / 403
Регистрация: 15.11.2014
Сообщений: 4,800
Завершенные тесты: 1
03.08.2015, 12:17     Могут ли теоретически существовать методы с неопределенным числом аргументов? #23
Цитата Сообщение от Tulosba Посмотреть сообщение
const char* const format = "%s";
граммар конст?
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16824 / 5245 / 319
Регистрация: 30.03.2009
Сообщений: 14,121
Записей в блоге: 26
03.08.2015, 12:17     Могут ли теоретически существовать методы с неопределенным числом аргументов? #24
Думается, для условного my_printf (которая не обязательно занимается печатью) с динамически сгенерированной форматной строкой для Си++ вменяемого аналога нет (как в своё время не было variadic template'ов). Пока это не будет статистически значимым, в Си++ никто не будет чего-то вносить по этому поводу. Но если вдруг понадобится, то может и придумают очередную монстровую конструкцию
Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
03.08.2015, 13:03     Могут ли теоретически существовать методы с неопределенным числом аргументов? #25
Цитата Сообщение от hoggy Посмотреть сообщение
граммар конст?
Да, чтоб сообщение компилятора получить.
Цитата Сообщение от Evg Посмотреть сообщение
это не технология безопасности, а поделка.
Тут, имхо, вопрос терминологии. Что считать "технологией", а что нет.
Например, если поделку стандартизировать, будет ли она считаться технологией по твоему мнению?
Я тут не делал различий, наверное поэтому фраза
Цитата Сообщение от Evg Посмотреть сообщение
но это никак не технология безопасности.
меня и смутила.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16824 / 5245 / 319
Регистрация: 30.03.2009
Сообщений: 14,121
Записей в блоге: 26
03.08.2015, 13:10     Могут ли теоретически существовать методы с неопределенным числом аргументов? #26
Цитата Сообщение от 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);
}
Код
$ 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);
т.е. обе строки формально некорректны, но предупреждение выдаётся только на вторую

В технологиях, используемых в Си++ невозможно отвязать значение от типа, а потому подобные моменты там в принципе возникнуть не могут. Поэтому вариант из Си++ уже тянет на то, чтобы назвать его словом "технология"
Voivoid
 Аватар для Voivoid
580 / 256 / 12
Регистрация: 31.03.2013
Сообщений: 1,283
03.08.2015, 14:24     Могут ли теоретически существовать методы с неопределенным числом аргументов? #27
Цитата Сообщение от Evg Посмотреть сообщение
Но платой за это является потеря гибкости при работе
Если ты про форматную строчку, то её точно так же можно использовать и с variadic template'ами. Код немного посложнее конечно будет
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
03.08.2015, 14:41     Могут ли теоретически существовать методы с неопределенным числом аргументов? #28
Касательно вариадиков, помните, что можно все делать без рекурсии.

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;
}
hoggy
5114 / 2115 / 403
Регистрация: 15.11.2014
Сообщений: 4,800
Завершенные тесты: 1
03.08.2015, 15:17     Могут ли теоретически существовать методы с неопределенным числом аргументов? #29
Цитата Сообщение от Tulosba Посмотреть сообщение
Да, чтоб сообщение компилятора получить.
значит это и сегодня тоже актуально)
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16824 / 5245 / 319
Регистрация: 30.03.2009
Сообщений: 14,121
Записей в блоге: 26
03.08.2015, 15:19     Могут ли теоретически существовать методы с неопределенным числом аргументов? #30
Цитата Сообщение от Voivoid Посмотреть сообщение
Если ты про форматную строчку
Я, например, про то, что я вот хочу иметь функцию в отдельном файле *.c (*.cc) и в хидере иметь только extern-описание функции. Идеология шаблонов Си++ накладывает ограничение в виде того, что так я сделать не могу
Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
03.08.2015, 16:05     Могут ли теоретически существовать методы с неопределенным числом аргументов? #31
немного упростил и доработал вариант 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 минут
Ну, и минус такой версии, что не работает с нулевым кол-вом параметров.
castaway
Эксперт С++
4839 / 2978 / 367
Регистрация: 10.11.2010
Сообщений: 11,012
Записей в блоге: 10
Завершенные тесты: 1
03.08.2015, 16:08     Могут ли теоретически существовать методы с неопределенным числом аргументов? #32
Цитата Сообщение от Tulosba Посмотреть сообщение
Ну, и минус такой версии, что не работает с нулевым кол-вом параметров.
Ну так.., а кому нужна версия с нулевым количеством параметров?) С одной стороны это даже плюс.
DiffEreD
 Аватар для DiffEreD
1420 / 757 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
03.08.2015, 16:09     Могут ли теоретически существовать методы с неопределенным числом аргументов? #33
Tulosba, а зачем здесь static_cast<void> ?
Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
03.08.2015, 23:06     Могут ли теоретически существовать методы с неопределенным числом аргументов? #34
Цитата Сообщение от 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'а. А вот когда длина данных не совпадает с форматом, тогда ошибка наиболее очевидна.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16824 / 5245 / 319
Регистрация: 30.03.2009
Сообщений: 14,121
Записей в блоге: 26
04.08.2015, 08:38     Могут ли теоретически существовать методы с неопределенным числом аргументов? #35
Цитата Сообщение от Tulosba Посмотреть сообщение
Как я понимаю, защита в первую очередь направлена на исключение ситуаций с разными размерами данных (в байтах)
Подсунь вместо unsigned данные типа float, которые того же размера и будет совсем всё по другому. А реальная причина в том, что некорректные коды используются повсеместно и либо пользователи взвыли от такой функциональности, либо они уже на этапе тестирования это поняли, а потому часть "защиты" сняли. Кстати, в режиме, когда размеры int'а и long'а совпадают, предупреждение всё равно есть, хотя номинально код отработает без ошибок

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

Цитата Сообщение от Evg Посмотреть сообщение
А то множество возможностей написания кода на Си++ в общем-то показывает ущербность той технологии, по которой пошли в Си++
Круто, что тут сказать, наличие множества возможностей это теперь считается ущербностью. О времена, о нравы
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
04.08.2015, 14:13     Могут ли теоретически существовать методы с неопределенным числом аргументов? #37
Tulosba, Там void() не спроста был в принципе, как подсказали товарищи на SO.) (здесь оно конечно не нужно, но в целом может пригодиться) http://stackoverflow.com/questions/3...43450#31743450
Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
04.08.2015, 15:01     Могут ли теоретически существовать методы с неопределенным числом аргументов? #38

Не по теме:

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

Цитата Сообщение от ForEveR Посмотреть сообщение
здесь оно конечно не нужно
Хорошо всё-таки, что перегружать можно не все подряд операторы.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16824 / 5245 / 319
Регистрация: 30.03.2009
Сообщений: 14,121
Записей в блоге: 26
04.08.2015, 16:45     Могут ли теоретически существовать методы с неопределенным числом аргументов? #39
Цитата Сообщение от Voivoid Посмотреть сообщение
Да какая разница
Я вот захочу поставить библиотеку с закрытым кодом. Я выставлю хидер, а код люди видеть не будут. На Си++ такой возможности попросту не будет. Ты можешь это считать чем угодно, я считаю это отсутствием гибкости и навязыванием способов проектирования

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

Цитата Сообщение от Voivoid Посмотреть сообщение
Круто, что тут сказать, наличие множества возможностей это теперь считается ущербностью
Видимо, ты либо плохо читаешь, либо не вникаешь. Посмотри мой вариант на Си, где по простому написано то, что я хочу. Посмотри варианты на Си++, где один вариант извращённее другого (как следствие "множества возможностей"). Опять-таки ты можешь считать это чем угодно, но я считаю это ущербностью языка. Потому что когда нужно сделать что-то простое, а приходится делать сложно (зато на чистом Си++, правда на одном из поздних стандартов) - лично мне это не нравится
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.08.2015, 17:07     Могут ли теоретически существовать методы с неопределенным числом аргументов?
Еще ссылки по теме:

C++ Как изменить значение переменной, переданной в списке с переменным числом аргументов
C++ GCC и функции с переменным числом аргументов
C++ Чем могут отличаться формальные параметры функции от ее аргументов?

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

Или воспользуйтесь поиском по форуму:
Voivoid
 Аватар для Voivoid
580 / 256 / 12
Регистрация: 31.03.2013
Сообщений: 1,283
04.08.2015, 17:07     Могут ли теоретически существовать методы с неопределенным числом аргументов? #40
Цитата Сообщение от Evg Посмотреть сообщение
Посмотри мой вариант на Си, где по простому написано то, что я хочу. Посмотри варианты на Си++, где один вариант извращённее другого
В этой теме от тебя был только кусочек кода с примером использования C'шного printf. Ты что с чем сравниваешь-то? Использование функции с её реализацией? Типа смотрите как легко на С использовать printf и как сложно на ущербном C++ реализовать типобезопасный printf. Так что-ли?

Цитата Сообщение от Evg Посмотреть сообщение
Потому что когда нужно сделать что-то простое, а приходится делать сложно (зато на чистом Си++, правда на одном из поздних стандартов) - лично мне это не нравится
Ну тогда у тебя наверняка найдется пример более простой реализации типобезопасного printf'а. Да, можно на любом языке.
Yandex
Объявления
04.08.2015, 17:07     Могут ли теоретически существовать методы с неопределенным числом аргументов?
Ответ Создать тему
Опции темы

Текущее время: 08:20. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru