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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Ferrari F1
=^_^=
562 / 449 / 94
Регистрация: 27.01.2015
Сообщений: 2,622
Записей в блоге: 1
Завершенные тесты: 1
#1

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

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

Разумно ли использовать va args в таких ситуациях?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.08.2015, 19:49
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Могут ли теоретически существовать методы с неопределенным числом аргументов? (C++):

Определить классы которые могут существовать только на стеке/динамически/которые нельзя копировать - C++
Определить 3 класса. 1. Объекты могут существовать только локально на стеке (как это понять?). 2. Объекты могут существовать только в...

Чем могут отличаться формальные параметры функции от ее аргументов? - C++
Если кто знает может помочь ответить на вопросы. Заранее спасибо 1 . Чем могут отличаться формальные параметры функции от ее аргументов ?...

Шаблоны с переменным числом аргументов - C++
Написал шаблон функции с переменным числом аргументов которая считает сумму своих аргументов. Практики по этому вопросу не имею, поэтому...

Функция с неуказанным числом аргументов - C++
Всем привет! Попытался реализовать функцию, которая выводит свои аргументы(все, кроме первого), но когда запускаю, она дополнительно ещё...

Функции с переменным числом аргументов - C++
на пример sum(2,56,515,-23.65,548)?

GCC и функции с переменным числом аргументов - C++
Писал мини приложение в студии для работы с векторами, один из методов просто получает сколько угодно аргументов и заполняет координаты...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
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
Эксперт С++
4881 / 3017 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
03.08.2015, 16:08 #32
Цитата Сообщение от Tulosba Посмотреть сообщение
Ну, и минус такой версии, что не работает с нулевым кол-вом параметров.
Ну так.., а кому нужна версия с нулевым количеством параметров?) С одной стороны это даже плюс.
DiffEreD
1430 / 767 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
03.08.2015, 16:09 #33
Tulosba, а зачем здесь static_cast<void> ?
Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
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
Эксперт CАвтор FAQ
17632 / 5856 / 376
Регистрация: 30.03.2009
Сообщений: 16,146
Записей в блоге: 26
04.08.2015, 08:38 #35
Цитата Сообщение от Tulosba Посмотреть сообщение
Как я понимаю, защита в первую очередь направлена на исключение ситуаций с разными размерами данных (в байтах)
Подсунь вместо unsigned данные типа float, которые того же размера и будет совсем всё по другому. А реальная причина в том, что некорректные коды используются повсеместно и либо пользователи взвыли от такой функциональности, либо они уже на этапе тестирования это поняли, а потому часть "защиты" сняли. Кстати, в режиме, когда размеры int'а и long'а совпадают, предупреждение всё равно есть, хотя номинально код отработает без ошибок

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

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

Не по теме:

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

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

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

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

Цитата Сообщение от Evg Посмотреть сообщение
Потому что когда нужно сделать что-то простое, а приходится делать сложно (зато на чистом Си++, правда на одном из поздних стандартов) - лично мне это не нравится
Ну тогда у тебя наверняка найдется пример более простой реализации типобезопасного printf'а. Да, можно на любом языке.
Evg
Эксперт CАвтор FAQ
17632 / 5856 / 376
Регистрация: 30.03.2009
Сообщений: 16,146
Записей в блоге: 26
04.08.2015, 17:18 #41
Цитата Сообщение от Voivoid Посмотреть сообщение
В этой теме от тебя был только кусочек кода с примером использования C'шного printf
В этой теме был кусочек кода с функцией условно my_printf, который до появления variadic templates в C++11 на C++ и написать-то нельзя было

Типобезопасность Си++ я никак не отношу к ущербности. Если ты хотя бы читал, что я пишу, то я довольно чётко описал, что типобезопасность Си++ (как следствие программирования через шаблоны) является платой за то, что программист не может сделать так, как ему хочется, а вовсе не самоцелью. Т.е. аналог моей короткой функции, которую можно было бы поместить в *.c (но не в хидер) на Си++ до сих пор написать нельзя. Это и есть ущербность Си++
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
04.08.2015, 17:21 #42
Цитата Сообщение от Evg Посмотреть сообщение
который до появления variadic templates в C++11 на C++ и написать-то нельзя было
Ну это не совсем честно и верно. Можно было написать, но с разумным ограничением числа шаблонных параметров (как и делали в бусте до var templates).
Evg
Эксперт CАвтор FAQ
17632 / 5856 / 376
Регистрация: 30.03.2009
Сообщений: 16,146
Записей в блоге: 26
04.08.2015, 17:37 #43
Цитата Сообщение от ForEveR Посмотреть сообщение
Можно было написать, но с разумным ограничением числа шаблонных параметров
Но это ведь и есть ущербность. Т.е. в boost'е люди вместо простого программирования по сути дела занимались извращениями и борьбой с Си++ (т.е. "победа над здравым смыслом", как это было красиво названо в одной из тем).
Voivoid
674 / 277 / 12
Регистрация: 31.03.2013
Сообщений: 1,339
04.08.2015, 17:41 #44
Цитата Сообщение от Evg Посмотреть сообщение
Т.е. аналог моей короткой функции, которую можно было бы поместить в *.c (но не в хидер) на Си++ до сих пор написать нельзя. Это и есть ущербность Си++

Как тут не вспомнить анекдот про японскую бензопилу:

Не по теме:

Купили как-то суровым сибирским лесорубам японскую бензопилу.
Собрались в кружок лесорубы, решили ее испытать.
Завели ее, подсунули ей деревце.
«Вжик» — сказала японская пила.
«У, ***...» — сказали лесорубы.
Подсунули ей деревце потолще. «Вж-ж-жик!» — сказала пила.
«Ух, ***!» — сказали лесорубы.
Подсунули ей толстенный кедр. «ВЖ-Ж-Ж-Ж-Ж-Ж-Ж-ЖИК!!!» — сказала пила.
«Ух ты, ***!!» — сказали лесорубы.
Подсунули ей железный лом. «КРЯК!» — сказала пила.
«Ага, ***!!!» — укоризненно сказали суровые сибирские лесорубы! И ушли рубить лес топорами…педалить бойлерплейт на сишечке

Evg
Эксперт CАвтор FAQ
17632 / 5856 / 376
Регистрация: 30.03.2009
Сообщений: 16,146
Записей в блоге: 26
04.08.2015, 18:08 #45
Цитата Сообщение от Voivoid Посмотреть сообщение
И ушли рубить лес топорами…педалить бойлерплейт на сишечке
Какой язык лучше учить?
Хоть это и является приколом, но отчасти хорошо демонстрирует парадокс. Чем быстрее становится железо, тем больше тормозят программы. Часть этих проблем ложится на современные языки программирования высокого уровня (которые развиваются не в вакууме, а с оглядкой на развитие железа), в которых есть неявная идиология в виде того, что программист должен программировать, а не думать, потому что надо всё сделать как можно быстрее, но не качественнее

К слову говоря, precompiled headers как технологическая цепочка в чём-то похожа на кэш процессора. И то, и другое являются ни разу не естественной вещью, которые родились только для того, чтобы заниматься устранением "плохой" работы других компонент (идеология шаблонов си++ и медленно работающая память соответственно)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.08.2015, 18:08
Привет! Вот еще темы с ответами:

Шаблонная функция с переменным числом аргументов - C++
Сабж. Каким образом можно запретить использование шаблонной функции, если тип одного из аргументов не соответствует требуемому? Есть...

Инициализация std::tuple переменным числом аргументов - C++
Добрый вечер. Мне нужно инициализировать объект std::tuple, который является членом некоторого другого шаблонного класса с переменным...

Функция с переменным числом аргументов (через шаблоны) - C++
Доброго времени суток! Встал вопрос с реализацией такой функции. template&lt;typename... Args&gt; returntype functionname(const Args&amp;......

Шаблон с переменным числом аргументов, и возвращаемое значение функции - C++
Здравствуйте! Использую С++11. Хочу возвращать элементы кортежа пытаюсь так, auto Deserialize(unsigned long long i) -&gt;...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
04.08.2015, 18:08
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru