Russian Qt Forum
Ноябрь 26, 2024, 02:29 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: функция с неопределенным числом параметров  (Прочитано 3771 раз)
virtual_root
Гость
« : Май 14, 2013, 15:05 »

Добрый день. Подскажите, пожалуйста, как мне написать функцию, чтобы она могла принимать неопределенное число аргументов типа QVariant ?
Я пыталась так сделать:
Код:
void Application::print(QVariant arg1,...){
        QVariant* n = &arg1;
        while(*n)
            qDebug()<<(*n);
    }
Но у меня не выходит.. компилятор ругается
Код:
ошибка: could not convert '* n' from 'QVariant' to 'bool'
Читала статью http://www.rsdn.ru/forum/cpp/418970.1, пыталась как в ней сделать но ничего не вышло..
Подскажите, кто с подобным сталкивался.
Записан
mutineer
Гость
« Ответ #1 : Май 14, 2013, 15:14 »

может проще будет отдавать в функцию QVariantList?
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #2 : Май 14, 2013, 15:21 »

Ещё можно через variabic template сделать:

Код
C++ (Qt)
template <typename T>
void print(T && s) {
   std::cout << s << std::endl;
}
 
 
template <typename T, typename ...Args>
void print(T && s, Args... args)  {
   std::cout << s << std::endl;
   print(args...);
}
 
int main()
{
   print(123, 'a', 3.14, "Hello word!");
   return 0;
}
 
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Serr500
Гость
« Ответ #3 : Май 14, 2013, 16:14 »

1) Оптимальнее всего, ИМХО, QVariantList.
2) Если не нравится, то читаем описание va_list, va_start, va_arg, va_end.
3) А статейку по ссылке можно было бы и до конца дочитать...  Подмигивающий
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #4 : Май 14, 2013, 19:37 »

1) Оптимальнее всего, ИМХО, QVariantList.
Создаем контейнер (который может и не нужен). Пихаем в него объекты. Подаем. Потом контейнер удаляется вызвав деструктор каждого элемента. Ну ни хрена себе "оптимально" Улыбающийся

Я пыталась так сделать:
Код:
void Application::print(QVariant arg1,...){
        QVariant* n = &arg1;
        while(*n)
            qDebug()<<(*n);
    }
Но у меня не выходит.. компилятор ругается
Эта самодеятельность неуместна. Надо как в примере: va_start, в цикле va_arg, после всего va_end. Все там получается
Записан
Serr500
Гость
« Ответ #5 : Май 14, 2013, 19:50 »

Ну ни хрена себе "оптимально" Улыбающийся
Упс... Хотел сказать "проще"...  Смеющийся Пора в отпуск.  Подмигивающий
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #6 : Май 14, 2013, 20:15 »

Создаем контейнер (который может и не нужен). Пихаем в него объекты. Подаем. Потом контейнер удаляется вызвав деструктор каждого элемента. Ну ни хрена себе "оптимально" Улыбающийся

Если уж говорить об оптимальности, то variabic template реализация будет оптимальнее. Во-первых никаких циклов, доп. операций и функций. И во-вторых она развернётся в компил тайм.
Да, + ещё и типы параметров туда можно любые всовывать.
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.071 секунд. Запросов: 22.