Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.96/23: Рейтинг темы: голосов - 23, средняя оценка - 4.96
117 / 114 / 10
Регистрация: 02.06.2011
Сообщений: 280
1

функции с переменным количеством параметров

11.09.2011, 00:46. Просмотров 4520. Ответов 29
Метки нет (Все метки)

для некоторого класса необходимо чтобы его конструктор принимал переменное количество параметров.
как это делается - понятно.
я использую va_list и т.д. из varargs.h
сложность возникла в том что с ее помощью нельзя узнать сколько параметров было передано
сейчас я делаю так
C++
1
2
3
4
5
    AddToList(frst);
va_list ap;
va_start(ap,frst);
while (AddToList(va_arg(ap,int)) > 0);
va_end(ap);
пока параметры больше нуля они добавляются в список с помощью AddToList(int);
но после последнего переданого параметра va_arg возвращает случайное число(наверно тож со стека)
его конечно можно отсеять проверкой на малый диапазов(обычно этот "мусор" очень большой по модулю) но есть вероятность что попадется малое значение и запишется в список - а это очень плохо!
собственно вопрос:
можно ли вообще как-то узнать сколько параметров было передано или еще каким-то образом правильно отсеять мусор?

P.S. как замену можно конечно первым параметром передавать количество аргументов(это все-же лучше чем случайный мусор) но тоже не очень удобно и надежно(можно не правильное количество передать и хотелось бы чтоб пользователь класса вообще не задумывался о количестве аргументов)
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.09.2011, 00:46
Ответы с готовыми решениями:

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

Функции с переменным количеством параметров
Прописываю в заголовке: void __fastcall TestClass::Test(int x, ...); компилятор выдает ошибку:...

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

Массив в функции с переменным количеством параметров
Добрый день. Не могу разобраться, как в функции с переменным количеством параметров сделать...

29
Эксперт С++
3210 / 1459 / 73
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
11.09.2011, 01:10 2
Лучший ответ Сообщение было отмечено как решение

Решение

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
 
template<typename... T>
void func(const T&... args) {
   std::cout << sizeof...(args) << std::endl;
}
 
int main() {
   func();
   func(1);
   func(1,2);
   func(1,2,3);
}
http://liveworkspace.org/code/... 2722b598ed
7
Делаю внезапно и красиво
Эксперт С++
1309 / 1224 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
11.09.2011, 08:22 3
Цитата Сообщение от niXman Посмотреть сообщение
typename...
Жаль, что такие вкусняшки почти никем пока не поддерживаются.(
0
117 / 114 / 10
Регистрация: 02.06.2011
Сообщений: 280
11.09.2011, 13:38  [ТС] 4
Цитата Сообщение от Deviaphan Посмотреть сообщение
Жаль, что такие вкусняшки почти никем пока не поддерживаются.(
да очень жаль - так как мой компилятор(VS 2010) не понимает такой записи
в любом случае спасибо
0
Эксперт С++
3210 / 1459 / 73
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
11.09.2011, 14:32 5
Deviaphan, SalterOk, могу только посочувствовать.
0
929 / 754 / 299
Регистрация: 09.12.2010
Сообщений: 1,346
Записей в блоге: 1
11.09.2011, 15:40 6
Все Microsoft-кие компилеры не поддерживают такую конструкцию, не нужно злоупотреблять этим.
0
Эксперт С++
5036 / 3096 / 271
Регистрация: 11.11.2009
Сообщений: 7,047
11.09.2011, 16:03 7
Лучший ответ Сообщение было отмечено как решение

Решение

Цитата Сообщение от xAtom Посмотреть сообщение
Все Microsoft-кие компилеры не поддерживают такую конструкцию, не нужно злоупотреблять этим
Не уж то первая половина фразы является причиной для принятия во внимание второй её половины? Стандарт принят, в стандарте есть шаблоны с переменным числом аргументов, и в последних gcc компиляторах они реализованы. То, что этого ещё не сделал Microsoft - только его проблемы.

Не по теме:

P.S. Сам юзаю студию, но в дополнение к ней всегда есть свеженькая версия mingw.

3
Эксперт С++
3210 / 1459 / 73
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
11.09.2011, 18:52 8
Цитата Сообщение от xAtom Посмотреть сообщение
не нужно злоупотреблять этим.
естественно. не нужно злоупотреблять такими компилерами.
0
бжни
2467 / 1676 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
11.09.2011, 18:58 9
Цитата Сообщение от silent_1991 Посмотреть сообщение
То, что этого ещё не сделал Microsoft - только его проблемы.
виндузовые проекты как правило ведут на msvc, так что логично учитывать возможности компилятора
0
Эксперт С++
3210 / 1459 / 73
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
11.09.2011, 19:03 10
Цитата Сообщение от alex_x_x Посмотреть сообщение
виндузовые проекты как правило ведут на msvc
никогда такого не замечал...

ладно, прекращаем оффтопить.
0
Заблокирован
Автор FAQ
12.09.2011, 14:06 11
Цитата Сообщение от SalterOk Посмотреть сообщение
для некоторого класса необходимо чтобы его конструктор принимал переменное количество параметров.
как это делается - понятно.
я использую va_list и т.д. из varargs.h
сложность возникла в том что с ее помощью нельзя узнать сколько параметров было передано
сейчас я делаю так
- недаром в printf и scanf есть строка формата аля "d%s%p" - посчитали сколько параметров приводить надо(в данном случае 3) и юзаем va_list. Вели в функцию в качестве доп аргумента строку формата и отталкиваемся от числа параметров в ней в чём проблема то????
0
Делаю внезапно и красиво
Эксперт С++
1309 / 1224 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
12.09.2011, 14:14 12
Если параметров не много и их типы постоянны, то можно использовать конструктор с параметрами по умолчанию.

Использовать (...) в конструкторе, ИМО, не кошерно.)
0
117 / 114 / 10
Регистрация: 02.06.2011
Сообщений: 280
12.09.2011, 16:52  [ТС] 13
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
недаром в printf и scanf есть строка формата аля "d%s%p" - посчитали сколько параметров приводить надо(в данном случае 3) и юзаем va_list. Вели в функцию в качестве доп аргумента строку формата и отталкиваемся от числа параметров в ней в чём проблема то????
мне это не совсем подходит так как это по сути обвертка над динамическим массивом разного размера, глубины и типа.
а в конструктор собственно и передается информация о размерах и количестве
0
Делаю внезапно и красиво
Эксперт С++
1309 / 1224 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
12.09.2011, 16:58 14
Цитата Сообщение от SalterOk Посмотреть сообщение
бвертка над динамическим массивом разного размера
Так может стоит использовать std::vector?
0
Заблокирован
Автор FAQ
12.09.2011, 16:59 15
Цитата Сообщение от SalterOk Посмотреть сообщение
а в конструктор собственно и передается информация о размерах и количестве
- как вариант передавай первым аргументом число аргументов и всё
0
117 / 114 / 10
Регистрация: 02.06.2011
Сообщений: 280
12.09.2011, 17:05  [ТС] 16
ну я уже собственно решил передавать первым параметром количество пока не Microsoft не реализует
стандарт как в примере niXman
вот небольшой пример как я делаю:
C++
1
2
3
4
5
6
DMDM<int> t(4,1,3,5,8); //создается 4-мерный массив типа int
int ew = t(0,1,4,6);  //аналогично t[0][1][4][6];
//только я так и не понял как сделать с квадратными скобками
DMDM<float> rew(3,1000,1000,1000);  
// 3-мерный массив типа float с размерами 1000х1000х1000
DMDM<std::string> str(3,5,6,7); //тут все так само
Добавлено через 3 минуты
Цитата Сообщение от Deviaphan Посмотреть сообщение
Так может стоит использовать std::vector?
я понимаю что это лучше но я это делаю для тренировки(первый шаблонный класс и т.д.)

Добавлено через 1 минуту
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
как вариант передавай первым аргументом число аргументов и всё
ну я уже так и делаю - реализация класса легче но не так удобно для использования
0
Заблокирован
Автор FAQ
12.09.2011, 17:11 17
Цитата Сообщение от SalterOk Посмотреть сообщение
ну я уже так и делаю - реализация класса легче но не так удобно для использования
- ну вот и норм вариант, зачем вдаваться в мудрёный разбор va_list, если сразу в него число параметров можно ввести
0
║XLR8║
1042 / 831 / 254
Регистрация: 25.07.2009
Сообщений: 4,121
Записей в блоге: 5
13.09.2011, 12:30 18
Почему не юзать чистый сишный код?

Добавлено через 2 минуты
Или передавать вектор параметров или ссылок на них?
0
117 / 114 / 10
Регистрация: 02.06.2011
Сообщений: 280
13.09.2011, 17:14  [ТС] 19
Цитата Сообщение от outoftime Посмотреть сообщение
Почему не юзать чистый сишный код?
это какой например?
без классов и всей их прелести??
Цитата Сообщение от outoftime Посмотреть сообщение
Или передавать вектор параметров или ссылок на них?
работа с этим классом должна быть как можно больше похожа на обычный статический многомерный массив
0
║XLR8║
1042 / 831 / 254
Регистрация: 25.07.2009
Сообщений: 4,121
Записей в блоге: 5
13.09.2011, 18:52 20
Цитата Сообщение от SalterOk Посмотреть сообщение
сложность возникла в том что с ее помощью нельзя узнать сколько параметров было передано
Прочтите литературу еще раз или глубже.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.09.2011, 18:52

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

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

Функции с переменным количеством параметров, stdarg.h. Исправить код
Почему не работает? В итоге получается 0, а если в функции все что надо заменить с float на int, то...

Шаблон функции с переменным количеством параметров и среднее арифметическое
Никак не могу придумать, как вычислить среднее арифметическое. Получилось найти сумму, а вот...

Шаблон с переменным количеством параметров
У меня компилятор Visual Studio 2012, но не работает следующий код: #include &lt;iostream&gt;...

Функция с переменным количеством параметров
Здравствуйте, возникла вот такая проблема: создаю функцию с переменным кол-ом параметров. Пример...

Функция с переменным количеством параметров
Доброго времени суток! Я озадачился таким вопросом - как производится компиляция функций с...


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

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

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