Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 5.00/7: Рейтинг темы: голосов - 7, средняя оценка - 5.00
Ferrari F1
791 / 521 / 156
Регистрация: 27.01.2015
Сообщений: 3,025
Записей в блоге: 1
Завершенные тесты: 1
#1

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

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

Разумно ли использовать va args в таких ситуациях?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.08.2015, 19:49
Ответы с готовыми решениями:

Определить классы которые могут существовать только на стеке/динамически/которые нельзя копировать
Определить 3 класса. 1. Объекты могут существовать только локально на стеке...

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

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

Функции с переменным числом аргументов
Ребята, подскажите пожалуйста, где можно обстоятельно и подробно прочитать про...

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

47
castaway
Эксперт С++
4930 / 3037 / 453
Регистрация: 10.11.2010
Сообщений: 11,116
Записей в блоге: 10
Завершенные тесты: 1
01.08.2015, 19:55 #2
Теоретически - могут. В каких-таких ситуациях?
0
Ferrari F1
791 / 521 / 156
Регистрация: 27.01.2015
Сообщений: 3,025
Записей в блоге: 1
Завершенные тесты: 1
01.08.2015, 19:58  [ТС] #3
castaway
в таких ситуациях?
Да, пожалуй, это было лишним)
0
0x10
2571 / 1751 / 288
Регистрация: 24.11.2012
Сообщений: 4,377
01.08.2015, 20:00 #4
В С++11 появились Variadic Templates.
0
tnk500
114 / 118 / 42
Регистрация: 25.08.2012
Сообщений: 1,294
Завершенные тесты: 3
01.08.2015, 23:24 #5
Ferrari F1, разумеется могут. Только обязательно наличие первого параметра, а также от программиста требуется более-менее "угадать" типы аргументов. Пример - printf(const char* str ...). Из str она узнает не только о количестве аргументов, но и о их типе.
0
Evg
Эксперт CАвтор FAQ
19283 / 7140 / 528
Регистрация: 30.03.2009
Сообщений: 19,986
Записей в блоге: 30
02.08.2015, 14:46 #6
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
Могут ли теоретически существовать методы с неопределенным кол-вом арг-ов?
А чем, по твоему, метод принципиально отличается от функции?
0
Ferrari F1
791 / 521 / 156
Регистрация: 27.01.2015
Сообщений: 3,025
Записей в блоге: 1
Завершенные тесты: 1
02.08.2015, 14:50  [ТС] #7
Evg, срашиваю из-за того, что считаю морально устаревшим использование древних средств языка вперемешку с классами. Мне это как минимум кажется неуместным
0
Evg
Эксперт CАвтор FAQ
19283 / 7140 / 528
Регистрация: 30.03.2009
Сообщений: 19,986
Записей в блоге: 30
02.08.2015, 14:53 #8
Попробуй написать что-то такое без использования va_arg'ов и стандартной библиотечной поддержки Си (т.е. на одних только "родных" технологиях Си++) и увидишь, что "из-за принципов" возникает много геморроя из ничего
cin cout и fscan fprintf
0
0x10
2571 / 1751 / 288
Регистрация: 24.11.2012
Сообщений: 4,377
02.08.2015, 14:53 #9
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
считаю морально устаревшим использование древних средств языка вперемешку с классами.
Так вариадики в помощь.
0
Tulosba
:)
Эксперт С++
4748 / 3242 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
02.08.2015, 14:55 #10
Цитата Сообщение от Evg Посмотреть сообщение
Попробуй написать что-то такое без использования va_arg'ов и стандартной библиотечной поддержки Си
Так ведь ответили уже:
Цитата Сообщение от 0x10 Посмотреть сообщение
В С++11 появились Variadic Templates.
0
Evg
Эксперт CАвтор FAQ
19283 / 7140 / 528
Регистрация: 30.03.2009
Сообщений: 19,986
Записей в блоге: 30
02.08.2015, 14:58 #11
Цитата Сообщение от Tulosba Посмотреть сообщение
Так ведь ответили уже:
Напиши пример, если не сложно. А то я не очень представляю, как оно будет выглядеть
0
0x10
2571 / 1751 / 288
Регистрация: 24.11.2012
Сообщений: 4,377
02.08.2015, 15:08 #12
Цитата Сообщение от 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
Tulosba
:)
Эксперт С++
4748 / 3242 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
02.08.2015, 15:14 #13
Цитата Сообщение от 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
19283 / 7140 / 528
Регистрация: 30.03.2009
Сообщений: 19,986
Записей в блоге: 30
02.08.2015, 15:33 #14
При таком раскладе действительно нет смысла опускаться до уровня языка Си. Правда опять всё упирается в шаблонное программирование, когда в хидера выставляется много кода, но это уже другой вопрос
0
Tulosba
:)
Эксперт С++
4748 / 3242 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
02.08.2015, 16:09 #15
Цитата Сообщение от Evg Посмотреть сообщение
При таком раскладе действительно нет смысла опускаться до уровня языка Си.
Основной момент, это то что с variadic templates мы получаем проверку типов на стадии компиляции. Хотя, где-то я натыкался на упоминание того, что в GСС и printf сделали безопасным к типам.
0
Evg
Эксперт CАвтор FAQ
19283 / 7140 / 528
Регистрация: 30.03.2009
Сообщений: 19,986
Записей в блоге: 30
02.08.2015, 16:42 #16
Цитата Сообщение от Tulosba Посмотреть сообщение
Хотя, где-то я натыкался на упоминание того, что в GСС и printf сделали безопасным к типам
Этого в принципе нельзя сделать. То, что сделано в gcc, это контроль со стороны компилятора в точке вызова printf'а при условии, что формат задан в виде строкового литерала. Понятно, что такими warning'ами накрывается 99% жизненных случаев, но это никак не технология безопасности. Между высоким уровнем (концепцией си++) и низким (концепция си) всегда есть соотношение: чем ниже уровень, тем меньше безопасности (в том смысле, что больше вещей перекладывается на программиста), но больше гибкости
0
Tulosba
:)
Эксперт С++
4748 / 3242 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
02.08.2015, 20:50 #17
Цитата Сообщение от Evg Посмотреть сообщение
но это никак не технология безопасности
А что же это тогда, если я явно получаю предупреждение в момент компиляции в случае несоответствия типов в формате и аргументов? Понятно, что это всё-таки предупреждение, а не ошибка, но дело тут в первую очередь именно в обнаружении ситуации на ранней стадии.
0
Evg
Эксперт CАвтор FAQ
19283 / 7140 / 528
Регистрация: 30.03.2009
Сообщений: 19,986
Записей в блоге: 30
02.08.2015, 23:40 #18
В таком примере сия технология ничего не обнаружит

C
char *format = "%s";
...
printf (format, 1);
да и вытекает оно вовсе не из каких-то особенностей языка (как это имеет место быть в Си++), а из дополнительных необязательных возможностей компилятора. Да, она в 99% решит проблему. Но это только в компиляторе gcc, в других-то такого может и не быть. В то время как в Си++ все компиляторы отработают одинаково из-за свойств языка
0
Tulosba
:)
Эксперт С++
4748 / 3242 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
03.08.2015, 09:06 #19
Цитата Сообщение от Evg Посмотреть сообщение
В таком примере сия технология ничего не обнаружит
Потому что в таком примере обработка формата по сути выносится в run-time.
На сях вероятно стоило бы использовать #define, а не char* для обеспечения проверки в compile-time.
А вот на C++ правильно объявить указатель на строку формата:
C++
1
const char* const format = "%s";
После чего механизм проверки типов в printf снова вернется к работе во время компиляции.
0
Evg
Эксперт CАвтор FAQ
19283 / 7140 / 528
Регистрация: 30.03.2009
Сообщений: 19,986
Записей в блоге: 30
03.08.2015, 11:58 #20
Цитата Сообщение от Tulosba Посмотреть сообщение
А вот на C++ правильно объявить указатель на строку формата
А кто тебе сказал, что форматная строка является константной? Она точно так же может генерироваться в runtime
0
03.08.2015, 11:58
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.08.2015, 11:58

Шаблоны с переменным числом аргументов
Написал шаблон функции с переменным числом аргументов которая считает сумму...

Написать функцию с переменным числом аргументов
Помогите понять, что от меня хотят-то вообще. Мне нужно: объявить функции в...

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

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