Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > Шаблоны функций |
Автор: SABROG 21.4.2008, 21:11 | ||||||
У меня много однотипных параметров, но в принципе эти типы: QString, double, int, unsigned int, bool, unsigned char. Поэтому, чтобы не писать для каждого типа свою реализацию функции я решил воспользоваться шаблонами:
Соответственно получаю косяк:
(13 строка на форуме в секции кода, где юзается T) Как бы так исхитрится, чтобы заставить QVariant хавать то что он и будет хавать в принципе, но видимо его пугает, что вместо стандартных типов могут быть кастомы ? --- Всё, допетрил. Ключевой момент:
|
Автор: SABROG 22.4.2008, 11:46 | ||
Нет, и все-таки есть проблема. Не удается преобразовать ни в какой тип данных:
Получаю: error: expected primary-expression before ';' token Я уж этот QVariant и через convert(QVariant::String) и через .value<QString>() пытался, ну никак не хочет. Теряется смысл шаблона, я думал компилятор должен закрывать глаза на это и подставлять только в том случае, когда идет непосредственный вызов функции из кода с нужными типами в параметрах. |
Автор: pilotnet 22.4.2008, 12:18 |
Что-то я не допераю вы везде пишите bool Dict::cTemplates::setParam(Tp::tParTypes parType, T) parent->pBase->bindValue(QLatin1String(":par"), qVariantFromValue(T)); "Т" - это ведь тип данных а не переменная этого типа это должно выглядеть как bool Dict::cTemplates::setParam(Tp::tParTypes parType,const T &value) а потом parent->pBase->bindValue(QLatin1String(":par"), qVariantFromValue(value)); или я не о том ? |
Автор: SABROG 22.4.2008, 12:21 | ||
О том, все правильно. Мой косяк, допетрил уже. Сейчас не могу другое понять, почему компилятор считает, что тип изначально передается как QString ?
--- Добавил еще пару функций с разными типами параметров, теперь характер ошибок изменился. Заподло, вот действительно было бы проще воспользоваться Copy->Paste и не заморачиваться насчет дублирующего кода. |
Автор: pilotnet 22.4.2008, 12:28 |
потому что в темплейтах определение типа происходит на стадии компиляции компилятор генерит код для каждого типа "T" |
Автор: SABROG 22.4.2008, 12:31 | ||
Значит придется возвращаться к тому с чего я начал. Обидно 2 вечера и утро потратил на разбор характера ошибок. Воспользуюсь тогда void * и cast'ами. |
Автор: pilotnet 22.4.2008, 12:41 | ||
чем не нравиться
|
Автор: SABROG 22.4.2008, 12:48 | ||||||
класс сTemplates имеет все те же члены, что в базе данных, поэтому их надо синхронно изменять: Например меняя имя (name), надо изменить и запись в БД
name это QString. Помимо имени есть еще параметры других типов, например ссылка на объект, которая может менятся, но в базе данных она принимает вид ключа с типом unsigned int.
--- Изначально идея была такая и видимо к ней придется вернутся:
Я бы не мог ЭТО назвать хорошим стилем программирования... |
Автор: pilotnet 22.4.2008, 13:03 |
дак тогда и передавай в эту функцию уже (unsigned int)tour->inc все равно тебе что передовать надо разбираться самому в зависимости от типа |
Автор: SABROG 22.4.2008, 13:16 | ||
Выбросил шаблон и сделал так:
|
Автор: Lazin 22.4.2008, 14:46 | ||
не знаю что такое QVariant, но мне кажется что boost::variant is more suitable
|
Автор: SABROG 22.4.2008, 15:27 |
С бустом у меня что-то никак не склеивается, не хочет под mingw собирать. Я так понимаю это паттерн ? Так сразу и не скажешь как он работает. |
Автор: Lazin 22.4.2008, 15:39 |
boost::apply_visitor вызывает одну из перегруженных версий оператора () функтора helper, в зависимости от типа своего содержимого если там строка, то вызовется void operator (QString & str) если int, то void operator (int) |
Автор: SABROG 22.4.2008, 16:18 |
А чем же это отличается от обычной перегрузки параметров ? К тому же у меня параметры хоть и имеют разные типы, но эти типы могут быть общими для двух разных параметров. |
Автор: SABROG 22.4.2008, 17:33 |
У меня сейчас идеологическая проблема возникла. По сути сейчас я пишу основное ядро программы. В прошлой версии при занесении или удалении данных из базы данных создавался диалог с прогрессбаром. Вот сейчас пытаюсь решить, если уж я пишу ядро, то каким боком мне сдался этот GUI внутри класса ? Врятли кто бы стал пихать в синглтон-класс гуевые окошечки. Походу надо передавать какую-нибудь callBack функцию или эмитить сигналы. |
Автор: JackYF 23.4.2008, 00:01 |
SABROG, да, было такое. Я emittил сигналы в этом случае. |
Автор: SABROG 23.4.2008, 11:12 | ||
А для этого необходимо чтобы класс был на базе QObject'a ? У меня такая задумка. Я не хочу использовать processAllEvents, т.к. у меня имеется скажем 50 операций, который могут выполнятся по 2-3 минуты каждая, я сделал прогрессбар, но естественно даже с процессоллевентс все висит. Вот теперь думаю как сделать так, чтобы из ядра программы сэмитить сигнал, который бы не только создал поток и прогрессбар, но и увеличивал при этом счетчик на прогрессе O.o |
Автор: Любитель 23.4.2008, 12:08 |
Наследовать от QObject надо. В чём проблема-то? Реализуешь негуёвую модель твоего пргресса (данные о прогрессе + сигналы для уведомления об его изменении). Затем при коннектишь гуй. |
Автор: SABROG 23.4.2008, 13:45 |
Мне необходим такой функционал из негуишного класса: - возможность менять ход прогресса - отменять прогресс - перехватывать отмену прогресса (юзер кликнул Cancel или крест) Это все мне может дать такая модель. Я создаю класс на базе QThread, куда пихаю QProgressDialog. Сам этот класс (QThread) создаю внутри негуишного класса, коннекчусь. Но в итоге получается что негуишный класс жестко привязан к GUI так или иначе. Но видать никуда от этого не деться, т.к. метод приватный и передать ссылку на объект QThread извне не получится. |
Автор: Любитель 23.4.2008, 14:13 |
Ты создаёшь без всякого гуя класс, у которого есть:
Этот же класс производит сами действия. Или же он универсальный абстрактный с чисто виртуальным методом для действия + наследник для этой ситуации (а в будущем ещё для сотни). С гую коннектишься к началу пргресса - создаёшь диалог. На изменение меняешь пргресс-бар. На клик по канселу коннектишь слот отмены. Мешать гуй и бизнес-логику - ни в коем случае! |