Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
|
Litkevich Yuriy |
30.12.2020, 7:53
Сообщение
#1
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94
|
Пытаюсь понять, как можно в С++ реализовать полиморфизм времени компиляции для следующей задачи.
Имеется шина 1-Wire (из названия понятно, что она однопроводная, несчитая общего проводника). Имеется N устройств на этой шине. Шина должна знать какие устройства на ней есть. Устройства должны знать на какой шине сидят. Устройства пользуются функциями-членами шины для выполнения своих задач. Особенность 1-Wire: 1) может быть реализована програмным дрыганьем ножки микроконтроллера; 2) может быть реализована через аппаратный UART, т.е. передавая определённый байт огибающая сигнала будет повторять необходимую форму ипульсов 1-Wire. 3) сам UART можно реализовать программно дрыгая ножку микроконтроллера. Т.о. возможны следующие схемы реализации 1-Wire: OneWire(Pin); OneWire(UART); OneWire(SoftUART(Pin)); Сейчас у меня сделан абстрактный класс 1-Wire и наследники, реализующие один из 3-х способов. // ====================================== Всё бы хорошо, но наличие виртуальных функций для микроконтроллерного применения - плохо. это замедляет код и раздувает его из-за vtable. Сначала хотел реализовать OneWire на шаблонах. Однако споткнулся на том, что класс OneWireDevice должен пользоваться OneWire и, в частности, возвращать OneWire. т.е. сделать сам OneWire шаблонным не получится, т.к. для метода OneWireDevice::wire() надо будет аргумент шаблона указывать. Может кому-то подобную иерархию со статическим полиморфизмом доводилось реализовывать? В идеале хотелось бы получить такой код применения:
Сообщение отредактировал Litkevich Yuriy - 30.12.2020, 12:12 |
|
|
|
|
Алексей1153 |
30.12.2020, 8:34
Сообщение
#2
|
![]() фрилансер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2946 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: 34
|
Цитата но наличие виртуальных функций для микроконтроллерного применения - плохо. это замедляет код и раздувает его из-за vtable. немного замедлит (вряд ли заметно), но не раздует. А вот шаблоны раздуют программный код сильно. И отлаживать их будет сложнее. Компилить дольше тоже. А стандарт C++ какой? Если 17, то Link подойдёт если что, реализацию std::variant можно найти, если компилятор его ещё не умеет ) Сообщение отредактировал Алексей1153 - 30.12.2020, 9:23 |
|
|
|
|
Алексей1153 |
30.12.2020, 9:18
Сообщение
#3
|
![]() фрилансер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2946 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: 34
|
Link
Цитата Pin
UART SoftUART Сообщение отредактировал Алексей1153 - 30.12.2020, 9:19 |
|
|
|
|
Litkevich Yuriy |
30.12.2020, 12:10
Сообщение
#4
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94
|
Цитата(Алексей1153 @ 30.12.2020, 11:18) Link using ControlWay=std::variant<EmptyDevice,Pin,UART,SoftUART>; что значит using в этом месте?Цитата(Алексей1153 @ 30.12.2020, 11:18) Link m_DeviceList.addDevice(new ControlWay{Pin{}}); почему здесь Pin с фигурными скобками?Если я правильно понял, то ControlWay с фигурными потому что он union или нет? Сообщение отредактировал Litkevich Yuriy - 30.12.2020, 12:11 |
|
|
|
|
Алексей1153 |
31.12.2020, 12:03
Сообщение
#5
|
![]() фрилансер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2946 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: 34
|
Цитата(Litkevich Yuriy @ 30.12.2020, 14:10) Link что значит using в этом месте объявление алиаса (более удобная замена typedef) Цитата(Litkevich Yuriy @ 30.12.2020, 14:10) Link почему здесь Pin с фигурными скобками {} - пустой список инициализации Pin{} - создание экземпляра класса Pin с конструктором по умолчанию ControlWay{Pin{}} - создание экземпляра класса ControlWay, конструктор принимает ссылку на объект класса Pin union тут не используется |
|
|
|
|
Litkevich Yuriy |
2.1.2021, 1:22
Сообщение
#6
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94
|
Цитата(Алексей1153 @ 31.12.2020, 14:03) Link Pin{} - создание экземпляра класса Pin с конструктором по умолчанию чем отличается от традиционного Pin() ? |
|
|
|
|
Алексей1153 |
2.1.2021, 13:12
Сообщение
#7
|
![]() фрилансер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2946 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: 34
|
Litkevich Yuriy, можно сказать, что ничем, но в редких случаях компилятор может перепутать с синтаксисом вызова или объявления функции. Со списком инициализации всё всегда однозначно
|
|
|
|
|
AlexandrVol |
9.9.2023, 0:18
Сообщение
#8
|
|
Новичок Группа: Неактивирован Сообщений: 1 Регистрация: 8.9.2023 Пользователь №: 5338 Спасибо сказали: 0 раз(а) Репутация: 0
|
Кста, полезные курсы для программирования на c# можно найти на Link
Кста, полезные курсы для программирования на c# можно найти на Link |
|
|
|
|
Awaken |
10.4.2025, 0:57
Сообщение
#9
|
|
Студент ![]() Группа: Неактивирован Сообщений: 14 Регистрация: 10.4.2025 Пользователь №: 5362 Спасибо сказали: 0 раз(а) Репутация: 0
|
не очень полезные
|
|
|
|
|
Warburst |
10.4.2025, 1:18
Сообщение
#10
|
|
Студент ![]() Группа: Неактивирован Сообщений: 18 Регистрация: 9.4.2025 Пользователь №: 5360 Спасибо сказали: 0 раз(а) Репутация: 0
|
и то верно
|
|
|
|
![]() ![]() ![]() |
|
Текстовая версия | Сейчас: 14.11.2025, 15:29 |