Форум программистов, компьютерный форум, киберфорум
Наши страницы

C++

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 32, средняя оценка - 4.91
SalterOk
115 / 112 / 1
Регистрация: 02.06.2011
Сообщений: 280
#1

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

11.09.2011, 00:46. Просмотров 4033. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.09.2011, 00:46
Здравствуйте! Я подобрал для вас темы с ответами на вопрос функции с переменным количеством параметров (C++):

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

Функция с переменным числом параметров - C++
Вычисление суммы ряда значений оформить в виде функции с переменным числом параметров. прога вот: В ней не хватает как рас...

Рефакторинг: функция с большим количеством параметров - C++
День добрый. Скажите плз, гуру рефакторинга. Вот есть функция и в нее передаётся туча параметров. Как лучше исправить ситуацию? На ум...

Список параметров функции из DLL - C++
В runtime загружаю DLL'ки, вывожу список функций содержащийся в них, но так и не нашёл вариантов как экспортировать типы аргументов и...

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

С помощью функции с переменным числом параметров посчитать сумму - C++ Builder
Что не так в коде программы???? НЕ компелируется, нужно было с помощью функции с переменным числом параметров посчитать сумму!

29
niXman
Эксперт С++
3139 / 1451 / 49
Регистрация: 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/e7e12217d856cf5e3d6c312722b598ed
7
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
11.09.2011, 08:22 #3
Цитата Сообщение от niXman Посмотреть сообщение
typename...
Жаль, что такие вкусняшки почти никем пока не поддерживаются.(
0
SalterOk
115 / 112 / 1
Регистрация: 02.06.2011
Сообщений: 280
11.09.2011, 13:38  [ТС] #4
Цитата Сообщение от Deviaphan Посмотреть сообщение
Жаль, что такие вкусняшки почти никем пока не поддерживаются.(
да очень жаль - так как мой компилятор(VS 2010) не понимает такой записи
в любом случае спасибо
0
niXman
Эксперт С++
3139 / 1451 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
11.09.2011, 14:32 #5
Deviaphan, SalterOk, могу только посочувствовать.
0
xAtom
915 / 740 / 60
Регистрация: 09.12.2010
Сообщений: 1,346
Записей в блоге: 1
11.09.2011, 15:40 #6
Все Microsoft-кие компилеры не поддерживают такую конструкцию, не нужно злоупотреблять этим.
0
silent_1991
Эксперт С++
4993 / 3051 / 149
Регистрация: 11.11.2009
Сообщений: 7,038
Завершенные тесты: 1
11.09.2011, 16:03 #7
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от xAtom Посмотреть сообщение
Все Microsoft-кие компилеры не поддерживают такую конструкцию, не нужно злоупотреблять этим
Не уж то первая половина фразы является причиной для принятия во внимание второй её половины? Стандарт принят, в стандарте есть шаблоны с переменным числом аргументов, и в последних gcc компиляторах они реализованы. То, что этого ещё не сделал Microsoft - только его проблемы.

Не по теме:

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

3
niXman
Эксперт С++
3139 / 1451 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
11.09.2011, 18:52 #8
Цитата Сообщение от xAtom Посмотреть сообщение
не нужно злоупотреблять этим.
естественно. не нужно злоупотреблять такими компилерами.
0
alex_x_x
бжни
2450 / 1655 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
11.09.2011, 18:58 #9
Цитата Сообщение от silent_1991 Посмотреть сообщение
То, что этого ещё не сделал Microsoft - только его проблемы.
виндузовые проекты как правило ведут на msvc, так что логично учитывать возможности компилятора
0
niXman
Эксперт С++
3139 / 1451 / 49
Регистрация: 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
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
12.09.2011, 14:14 #12
Если параметров не много и их типы постоянны, то можно использовать конструктор с параметрами по умолчанию.

Использовать (...) в конструкторе, ИМО, не кошерно.)
0
SalterOk
115 / 112 / 1
Регистрация: 02.06.2011
Сообщений: 280
12.09.2011, 16:52  [ТС] #13
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
недаром в printf и scanf есть строка формата аля "d%s%p" - посчитали сколько параметров приводить надо(в данном случае 3) и юзаем va_list. Вели в функцию в качестве доп аргумента строку формата и отталкиваемся от числа параметров в ней в чём проблема то????
мне это не совсем подходит так как это по сути обвертка над динамическим массивом разного размера, глубины и типа.
а в конструктор собственно и передается информация о размерах и количестве
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
12.09.2011, 16:58 #14
Цитата Сообщение от SalterOk Посмотреть сообщение
бвертка над динамическим массивом разного размера
Так может стоит использовать std::vector?
0
-=ЮрА=-
Заблокирован
Автор FAQ
12.09.2011, 16:59 #15
Цитата Сообщение от SalterOk Посмотреть сообщение
а в конструктор собственно и передается информация о размерах и количестве
- как вариант передавай первым аргументом число аргументов и всё
0
12.09.2011, 16:59
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.09.2011, 16:59
Привет! Вот еще темы с ответами:

Функция с переменным числом параметров - C++ Builder
Хочу написать функцию очищающую произвольное число MaskEdit.Выдает ошибку в описании функции. Вот код, как правильно? void...

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

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

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


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

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

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