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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 32, средняя оценка - 4.91
SalterOk
 Аватар для SalterOk
114 / 111 / 1
Регистрация: 02.06.2011
Сообщений: 280
11.09.2011, 00:46     функции с переменным количеством параметров #1
для некоторого класса необходимо чтобы его конструктор принимал переменное количество параметров.
как это делается - понятно.
я использую 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. как замену можно конечно первым параметром передавать количество аргументов(это все-же лучше чем случайный мусор) но тоже не очень удобно и надежно(можно не правильное количество передать и хотелось бы чтоб пользователь класса вообще не задумывался о количестве аргументов)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.09.2011, 00:46     функции с переменным количеством параметров
Посмотрите здесь:

Функции по переменным количеством параметров C++
C++ Функция с переменным количеством параметров-оъектов
Странное поведение функции с переменным количеством аргументов C++ WinAPI
C++ Builder Функции с переменным количеством параметров
C++ Функции с переменным количеством параметров, stdarg.h. Исправить код
Функция с переменным количеством параметров C++
C++ Шаблон с переменным количеством параметров
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
niXman
Эксперт C++
 Аватар для niXman
3133 / 1445 / 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/e7e122...6c312722b598ed
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
11.09.2011, 08:22     функции с переменным количеством параметров #3
Цитата Сообщение от niXman Посмотреть сообщение
typename...
Жаль, что такие вкусняшки почти никем пока не поддерживаются.(
SalterOk
 Аватар для SalterOk
114 / 111 / 1
Регистрация: 02.06.2011
Сообщений: 280
11.09.2011, 13:38  [ТС]     функции с переменным количеством параметров #4
Цитата Сообщение от Deviaphan Посмотреть сообщение
Жаль, что такие вкусняшки почти никем пока не поддерживаются.(
да очень жаль - так как мой компилятор(VS 2010) не понимает такой записи
в любом случае спасибо
niXman
Эксперт C++
 Аватар для niXman
3133 / 1445 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
11.09.2011, 14:32     функции с переменным количеством параметров #5
Deviaphan, SalterOk, могу только посочувствовать.
xAtom
 Аватар для xAtom
910 / 735 / 60
Регистрация: 09.12.2010
Сообщений: 1,346
Записей в блоге: 1
11.09.2011, 15:40     функции с переменным количеством параметров #6
Все Microsoft-кие компилеры не поддерживают такую конструкцию, не нужно злоупотреблять этим.
silent_1991
Эксперт C++
4945 / 3021 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
11.09.2011, 16:03     функции с переменным количеством параметров #7
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от xAtom Посмотреть сообщение
Все Microsoft-кие компилеры не поддерживают такую конструкцию, не нужно злоупотреблять этим
Не уж то первая половина фразы является причиной для принятия во внимание второй её половины? Стандарт принят, в стандарте есть шаблоны с переменным числом аргументов, и в последних gcc компиляторах они реализованы. То, что этого ещё не сделал Microsoft - только его проблемы.

Не по теме:

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

niXman
Эксперт C++
 Аватар для niXman
3133 / 1445 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
11.09.2011, 18:52     функции с переменным количеством параметров #8
Цитата Сообщение от xAtom Посмотреть сообщение
не нужно злоупотреблять этим.
естественно. не нужно злоупотреблять такими компилерами.
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
11.09.2011, 18:58     функции с переменным количеством параметров #9
Цитата Сообщение от silent_1991 Посмотреть сообщение
То, что этого ещё не сделал Microsoft - только его проблемы.
виндузовые проекты как правило ведут на msvc, так что логично учитывать возможности компилятора
niXman
Эксперт C++
 Аватар для niXman
3133 / 1445 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
11.09.2011, 19:03     функции с переменным количеством параметров #10
Цитата Сообщение от alex_x_x Посмотреть сообщение
виндузовые проекты как правило ведут на msvc
никогда такого не замечал...

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

Использовать (...) в конструкторе, ИМО, не кошерно.)
SalterOk
 Аватар для SalterOk
114 / 111 / 1
Регистрация: 02.06.2011
Сообщений: 280
12.09.2011, 16:52  [ТС]     функции с переменным количеством параметров #13
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
недаром в printf и scanf есть строка формата аля "d%s%p" - посчитали сколько параметров приводить надо(в данном случае 3) и юзаем va_list. Вели в функцию в качестве доп аргумента строку формата и отталкиваемся от числа параметров в ней в чём проблема то????
мне это не совсем подходит так как это по сути обвертка над динамическим массивом разного размера, глубины и типа.
а в конструктор собственно и передается информация о размерах и количестве
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
12.09.2011, 16:58     функции с переменным количеством параметров #14
Цитата Сообщение от SalterOk Посмотреть сообщение
бвертка над динамическим массивом разного размера
Так может стоит использовать std::vector?
-=ЮрА=-
Заблокирован
Автор FAQ
12.09.2011, 16:59     функции с переменным количеством параметров #15
Цитата Сообщение от SalterOk Посмотреть сообщение
а в конструктор собственно и передается информация о размерах и количестве
- как вариант передавай первым аргументом число аргументов и всё
SalterOk
 Аватар для SalterOk
114 / 111 / 1
Регистрация: 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 минуту
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
как вариант передавай первым аргументом число аргументов и всё
ну я уже так и делаю - реализация класса легче но не так удобно для использования
-=ЮрА=-
Заблокирован
Автор FAQ
12.09.2011, 17:11     функции с переменным количеством параметров #17
Цитата Сообщение от SalterOk Посмотреть сообщение
ну я уже так и делаю - реализация класса легче но не так удобно для использования
- ну вот и норм вариант, зачем вдаваться в мудрёный разбор va_list, если сразу в него число параметров можно ввести
outoftime
║XLR8║
 Аватар для outoftime
505 / 427 / 33
Регистрация: 25.07.2009
Сообщений: 2,297
13.09.2011, 12:30     функции с переменным количеством параметров #18
Почему не юзать чистый сишный код?

Добавлено через 2 минуты
Или передавать вектор параметров или ссылок на них?
SalterOk
 Аватар для SalterOk
114 / 111 / 1
Регистрация: 02.06.2011
Сообщений: 280
13.09.2011, 17:14  [ТС]     функции с переменным количеством параметров #19
Цитата Сообщение от outoftime Посмотреть сообщение
Почему не юзать чистый сишный код?
это какой например?
без классов и всей их прелести??
Цитата Сообщение от outoftime Посмотреть сообщение
Или передавать вектор параметров или ссылок на них?
работа с этим классом должна быть как можно больше похожа на обычный статический многомерный массив
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.09.2011, 18:52     функции с переменным количеством параметров
Еще ссылки по теме:

Массив в функции с переменным количеством параметров C++
Функции с переменным количеством параметров в языке C ++ C++
Функция с переменным количеством параметров C++
C++ шаблон функции с переменным количеством аргументов
C++ Функция суммы с переменным количеством параметров

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

Или воспользуйтесь поиском по форуму:
outoftime
║XLR8║
 Аватар для outoftime
505 / 427 / 33
Регистрация: 25.07.2009
Сообщений: 2,297
13.09.2011, 18:52     функции с переменным количеством параметров #20
Цитата Сообщение от SalterOk Посмотреть сообщение
сложность возникла в том что с ее помощью нельзя узнать сколько параметров было передано
Прочтите литературу еще раз или глубже.
Yandex
Объявления
13.09.2011, 18:52     функции с переменным количеством параметров
Ответ Создать тему
Опции темы

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