1 | ||||||||||||||||
Шаблоны: определить класс в функции и вызвать его метод03.08.2015, 23:33. Показов 1932. Ответов 24
Метки нет (Все метки)
Здравствуйте форумчане.
Есть два класса:
Код
'class Wt::WLineEdit' has no member named 'selectedIndexes' std::set<int> selection = component_->selectedIndexes(); С уважением QVO.
0
|
03.08.2015, 23:33 | |
Ответы с готовыми решениями:
24
Создать класс Triad (тройка чисел); определить метод сравнения триад. Определить производный класс Date Как создать метод и вызвать его Как вызвать метод из одного класса в другой класс Возможно ли вызвать метод наследника через указатель на базовый класс |
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
|
|
03.08.2015, 23:58 | 2 |
Интерфейсы в С++
1
|
Неэпический
|
|
04.08.2015, 00:07 | 3 |
Если C потомок Widget (естественно с виртуальными плюшками), то можете с помощью dynamic_cast привести component_ к нужному типу (WSelectionBox или WLineEdit), но че-т как-то не смотрится...
1
|
584 / 387 / 216
Регистрация: 20.01.2013
Сообщений: 1,169
|
||||||
04.08.2015, 10:54 | 5 | |||||
Наверное как то так
0
|
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
|
||||||
04.08.2015, 11:15 | 6 | |||||
0
|
Игогошка!
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
|
|
04.08.2015, 11:46 | 7 |
QVO, про задачу ничего и не рассказал. Что ты хочешь сделать? Можно ли менять исходные классы? Почему именно выбрал шаблоны, а не виртуальные функции? Одно знаю точно - сохранение в том стиле, в котором хочешь сделать ты (с явными проверками на тип), делать не надо.
0
|
04.08.2015, 12:21 | 8 | |||||
Сообщение было отмечено QVO как решение
Решение
Как вариант:
3
|
04.08.2015, 13:13 [ТС] | 9 | |||||||||||||||||||||||||
ct0r, в общих чертах есть модели сущностей в БД MySQL. Хочу сделать GUI редактор БД.
Интерфейсы не подходят, т.к. придется переписывать код. Пример модели:
Допустим кликнул по названию игры, вызвалось окошко содержащее только 1 эдит под название. Нажал на кнопку и создал виджет со всеми полями для редактирования модели. (ячейку для ввода названия игры и список для выбора уже существующих тегов) И при нажатие кнопки сохранить после редактирование данных исполняется такой код:
Если я передаю поле модели с типом std::string (&Game::name) то в методе возникают ошибки, т.к. std::string не владеет методами clear и insert.
0
|
05.08.2015, 23:17 [ТС] | 10 | |||||
DiffEreD, есть подход, который даст возможность вызвать более двух имплементируемых методов?
К примеру параметры:
С уважением QVO.
0
|
05.08.2015, 23:31 | 11 | |||||
Сообщение было отмечено QVO как решение
Решение
Делать через std::enable_if
Добавлено через 7 минут Примерно так:
1
|
05.08.2015, 23:55 [ТС] | 12 | ||||||||||
DiffEreD, у меня вот так вышло:
DiffEreD, может подскажешь еще как в метапрограммирование можно задать поле, которое может быть пустым. Сейчас на примере покажу:
0
|
06.08.2015, 00:13 | 13 | |||||
Задать параметр шаблона по умолчанию:
Или тут что то другое имелось ввиду?
1
|
06.08.2015, 00:22 [ТС] | 14 | |||||||||||||||
DiffEreD, подправил твои функции:
Код
call of overloaded 'foo_impl()' is ambiguous foo_impl<R, ptrType>();
0
|
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||||||||||||||||
06.08.2015, 00:23 | 15 | |||||||||||||||
Сообщение было отмечено QVO как решение
Решение
ответ на ваш вопрос:
1. Специализация шаблона
2. SFINAE - перегрузка.
и делегировать в "зависимости от" каким то другим функциям. рантайм-конструкции вида :
2
|
06.08.2015, 00:47 [ТС] | 17 | |||||||||||||||
DiffEreD,
hoggy, можно сделать так?
Ошибка при компиляции: Код
call of overloaded 'foo_impl()' is ambiguous foo_impl<R, ptrType>();
0
|
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
06.08.2015, 02:52 | 18 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||
очевидно жеж, что нельзя.
итак, справочка: как работает SFINAE ? итак, предположим, у нас есть функция foo, которая принимает некое T. если T - дробное число (float/double), мы хотим обработать его одним способом. если T - интегральное число - другим способом. во всех остальных случаях, мы хотим ошибку компиляции. как это сделать? можно было бы написать 100500 перегрузок под все возможные интегральные типы и плавающие. но это - много много копипасты. а хочется написать парочку шаблонов под два сценария. напишем пробный шаблон:
если только он умеет выводиться в std::cout. но он не умеет различать интегральные,дробные,и прочие. что же делать? как различить типы по интересным нам свойствам? можно например, применить элементы метапрограммирования:
метафункция
ну а иначе - это что-то другое. у этого способа есть недостатки. 1. ветвление логики происходит в рантайме. то есть это не эффективно. программа будет тратить время на такую выборку. 2. мы не получаем ошибку компиляции если T ни интегральное, ни дробное. 3. это уже фатальный недостаток. в зависимости от Т отработает только одна какая то ветвь исполнения. однако в компиляцию войдут все 3 ветви. часто, требуются разные сценарии просто потому, что в зависимости от T только одна ветвь может скомпилироваться. а остальные ветви приведут к ошибке компиляции. и поэтому рантайм-решение просто физически не способно работать. все эти недостатки можно устранить разом, если инстанцировать только одну, нужную для конкретного Т ветвь, а остальные ветви вообще не включать в компиляцию. тогда программа не будет тратить драгоценное машинное время на выборку. и не будет ошибок компиляции, связанных с инстанцированием сценариев несовместимых с конкретным Т. итак, знакомьтесь, эту технику SFINAE официально узаконил стандарт:
а значит result будет равно U если BoolValue - false, тогда type вообще не будет существовать, и вся эта конструкция будет не валидна (не скомпилируется)
если теоретически может существовать такое T, при котором шаблоно-перегруженная функция может корректно скомпилироваться, то компилятор не будет генерировать ошибку. он просто отбросит такую перегрузку из конкурса выбора претендентов. и будет пытаться использовать другую перегрузку. теперь пишем наши сценарии обработки данных в зависимости от T:
а второй пользователю указывать не нужно. он выведется автоматически в зависимости от T и если T подходящее - получится T*, а если не подходящее - шаблон просто отбрасывается. в итоге, в зависимости от Т только одна из перегрузок будет инстанцированна. все остальные будут забракованы. вот так, с помощью SFINAE в компалтайме разруливается, какую нужно взять функцию для обработки данных в зависимости от свойств типа. -——————————————————- код получается несколько громоздким, и поэтому хочется навести легкую косметику: http://rextester.com/BLBO36917
Теперь возвращаемся к вашему примеру:
допустим, выживет только одна. а вот самая последняя перегрузка :
ведь SFINAE её никак не срезает. а значит она всегда будет среди претендентов на выбор. в этой ситуации получается, что если хотя бы одна из первых двух перегрузок выживет после SFINAE, то она вступает в конфликт с 3й, которая всегда участвует в конкурсе, и подходит под любые параметры. вот так у вас и образуется "неоднозначность вызова".
4
|
06.08.2015, 03:17 [ТС] | 19 | ||||||||||
hoggy, благодарю за развернутый ответ!
Я разбил функции по типа и они содержат разную логику:
И вызываются с метода save()
Код
use of 'this' in a constant expression modify_impl<member_, DboModel>(); ^ no matching function for call to 'G::Field<G::Game, Wt::Dbo::ptr<G::Genre>, Wt::WComboBox, G::Genre>::modify_impl()' modify_impl<member_, DboModel>(); ^ no matching function for call to 'G::Field<G::Game, Wt::WString, Wt::WTextArea, void>::modify_impl()' modify_impl<member_, DboModel>(); ^
0
|
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||||||
06.08.2015, 03:22 | 20 | |||||
смотрите сюда:
либо константы времени компиляции.
1
|
06.08.2015, 03:22 | |
06.08.2015, 03:22 | |
Помогаю со студенческими работами здесь
20
Передать метод как параметр и вызвать его Абстрактный класс и его наследники - не получается вызвать методы Как вызвать несколько раз метод после его окончания Eсть событие в WindowsForms button1_click и есть класс. Как вызвать метод класса в событии? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |