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

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

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

Author24 — интернет-сервис помощи студентам
Разумно ли использовать va args в таких ситуациях?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.08.2015, 19:49
Ответы с готовыми решениями:

Функция с неопределенным количеством аргументов
Доброго времени суток! Каким образом можно в Delphi создать функцию с заранее неизвестным...

Как отфильтровать сводную таблицу, если все критерии могут не существовать?
Есть код фильтра: With ActiveSheet.PivotTables("Сводная1").PivotFields("Отклонения")...

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

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

47
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
01.08.2015, 19:55 2
Теоретически - могут. В каких-таких ситуациях?
0
805 / 532 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
01.08.2015, 19:58  [ТС] 3
castaway
в таких ситуациях?
Да, пожалуй, это было лишним)
0
3257 / 2059 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
01.08.2015, 20:00 4
В С++11 появились Variadic Templates.
0
117 / 121 / 42
Регистрация: 25.08.2012
Сообщений: 1,294
01.08.2015, 23:24 5
Ferrari F1, разумеется могут. Только обязательно наличие первого параметра, а также от программиста требуется более-менее "угадать" типы аргументов. Пример - printf(const char* str ...). Из str она узнает не только о количестве аргументов, но и о их типе.
0
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
02.08.2015, 14:46 6
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
Могут ли теоретически существовать методы с неопределенным кол-вом арг-ов?
А чем, по твоему, метод принципиально отличается от функции?
0
805 / 532 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
02.08.2015, 14:50  [ТС] 7
Evg, срашиваю из-за того, что считаю морально устаревшим использование древних средств языка вперемешку с классами. Мне это как минимум кажется неуместным
0
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
02.08.2015, 14:53 8
Попробуй написать что-то такое без использования va_arg'ов и стандартной библиотечной поддержки Си (т.е. на одних только "родных" технологиях Си++) и увидишь, что "из-за принципов" возникает много геморроя из ничего
cin cout и fscan fprintf
0
3257 / 2059 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
02.08.2015, 14:53 9
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
считаю морально устаревшим использование древних средств языка вперемешку с классами.
Так вариадики в помощь.
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
02.08.2015, 14:55 10
Цитата Сообщение от Evg Посмотреть сообщение
Попробуй написать что-то такое без использования va_arg'ов и стандартной библиотечной поддержки Си
Так ведь ответили уже:
Цитата Сообщение от 0x10 Посмотреть сообщение
В С++11 появились Variadic Templates.
0
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
02.08.2015, 14:58 11
Цитата Сообщение от Tulosba Посмотреть сообщение
Так ведь ответили уже:
Напиши пример, если не сложно. А то я не очень представляю, как оно будет выглядеть
0
3257 / 2059 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
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
:)
Эксперт С++
4773 / 3267 / 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
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
02.08.2015, 15:33 14
При таком раскладе действительно нет смысла опускаться до уровня языка Си. Правда опять всё упирается в шаблонное программирование, когда в хидера выставляется много кода, но это уже другой вопрос
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
02.08.2015, 16:09 15
Цитата Сообщение от Evg Посмотреть сообщение
При таком раскладе действительно нет смысла опускаться до уровня языка Си.
Основной момент, это то что с variadic templates мы получаем проверку типов на стадии компиляции. Хотя, где-то я натыкался на упоминание того, что в GСС и printf сделали безопасным к типам.
0
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
02.08.2015, 16:42 16
Цитата Сообщение от Tulosba Посмотреть сообщение
Хотя, где-то я натыкался на упоминание того, что в GСС и printf сделали безопасным к типам
Этого в принципе нельзя сделать. То, что сделано в gcc, это контроль со стороны компилятора в точке вызова printf'а при условии, что формат задан в виде строкового литерала. Понятно, что такими warning'ами накрывается 99% жизненных случаев, но это никак не технология безопасности. Между высоким уровнем (концепцией си++) и низким (концепция си) всегда есть соотношение: чем ниже уровень, тем меньше безопасности (в том смысле, что больше вещей перекладывается на программиста), но больше гибкости
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
02.08.2015, 20:50 17
Цитата Сообщение от Evg Посмотреть сообщение
но это никак не технология безопасности
А что же это тогда, если я явно получаю предупреждение в момент компиляции в случае несоответствия типов в формате и аргументов? Понятно, что это всё-таки предупреждение, а не ошибка, но дело тут в первую очередь именно в обнаружении ситуации на ранней стадии.
0
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
02.08.2015, 23:40 18
В таком примере сия технология ничего не обнаружит

C
char *format = "%s";
...
printf (format, 1);
да и вытекает оно вовсе не из каких-то особенностей языка (как это имеет место быть в Си++), а из дополнительных необязательных возможностей компилятора. Да, она в 99% решит проблему. Но это только в компиляторе gcc, в других-то такого может и не быть. В то время как в Си++ все компиляторы отработают одинаково из-за свойств языка
0
:)
Эксперт С++
4773 / 3267 / 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
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
03.08.2015, 11:58 20
Цитата Сообщение от Tulosba Посмотреть сообщение
А вот на C++ правильно объявить указатель на строку формата
А кто тебе сказал, что форматная строка является константной? Она точно так же может генерироваться в runtime
0
03.08.2015, 11:58
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.08.2015, 11:58
Помогаю со студенческими работами здесь

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

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

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

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


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru