Russian Qt Forum

Qt => Вопросы новичков => Тема начата: virtual_root от Май 14, 2013, 15:05



Название: функция с неопределенным числом параметров
Отправлено: 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 (http://www.rsdn.ru/forum/cpp/418970.1), пыталась как в ней сделать но ничего не вышло..
Подскажите, кто с подобным сталкивался.


Название: Re: функция с неопределенным числом параметров
Отправлено: mutineer от Май 14, 2013, 15:14
может проще будет отдавать в функцию QVariantList?


Название: Re: функция с неопределенным числом параметров
Отправлено: m_ax от Май 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;
}
 


Название: Re: функция с неопределенным числом параметров
Отправлено: Serr500 от Май 14, 2013, 16:14
1) Оптимальнее всего, ИМХО, QVariantList.
2) Если не нравится, то читаем описание va_list, va_start, va_arg, va_end.
3) А статейку по ссылке можно было бы и до конца дочитать...  ;)


Название: Re: функция с неопределенным числом параметров
Отправлено: Igors от Май 14, 2013, 19:37
1) Оптимальнее всего, ИМХО, QVariantList.
Создаем контейнер (который может и не нужен). Пихаем в него объекты. Подаем. Потом контейнер удаляется вызвав деструктор каждого элемента. Ну ни хрена себе "оптимально" :)

Я пыталась так сделать:
Код:
void Application::print(QVariant arg1,...){
        QVariant* n = &arg1;
        while(*n)
            qDebug()<<(*n);
    }
Но у меня не выходит.. компилятор ругается
Эта самодеятельность неуместна. Надо как в примере: va_start, в цикле va_arg, после всего va_end. Все там получается


Название: Re: функция с неопределенным числом параметров
Отправлено: Serr500 от Май 14, 2013, 19:50
Ну ни хрена себе "оптимально" :)
Упс... Хотел сказать "проще"...  ;D Пора в отпуск.  ;)


Название: Re: функция с неопределенным числом параметров
Отправлено: m_ax от Май 14, 2013, 20:15
Создаем контейнер (который может и не нужен). Пихаем в него объекты. Подаем. Потом контейнер удаляется вызвав деструктор каждого элемента. Ну ни хрена себе "оптимально" :)

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