Статический полиморфизм |
Здравствуйте, гость ( Вход | Регистрация )
Статический полиморфизм |
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
|
фрилансер Группа: Участник Сообщений: 2941 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: 34 |
Цитата но наличие виртуальных функций для микроконтроллерного применения - плохо. это замедляет код и раздувает его из-за vtable. немного замедлит (вряд ли заметно), но не раздует. А вот шаблоны раздуют программный код сильно. И отлаживать их будет сложнее. Компилить дольше тоже. А стандарт C++ какой? Если 17, то std::variant подойдёт если что, реализацию std::variant можно найти, если компилятор его ещё не умеет ) Сообщение отредактировал Алексей1153 - 30.12.2020, 9:23 |
|
|
Алексей1153 |
30.12.2020, 9:18
Сообщение
#3
|
фрилансер Группа: Участник Сообщений: 2941 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: 34 |
https://onlinegdb.com/r1J-2ctTv
Цитата Pin
UART SoftUART Сообщение отредактировал Алексей1153 - 30.12.2020, 9:19 |
|
|
Litkevich Yuriy |
30.12.2020, 12:10
Сообщение
#4
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
using ControlWay=std::variant<EmptyDevice,Pin,UART,SoftUART>; что значит using в этом месте?m_DeviceList.addDevice(new ControlWay{Pin{}}); почему здесь Pin с фигурными скобками?Если я правильно понял, то ControlWay с фигурными потому что он union или нет? Сообщение отредактировал Litkevich Yuriy - 30.12.2020, 12:11 |
|
|
Алексей1153 |
31.12.2020, 12:03
Сообщение
#5
|
фрилансер Группа: Участник Сообщений: 2941 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: 34 |
что значит using в этом месте объявление алиаса (более удобная замена typedef) почему здесь Pin с фигурными скобками {} - пустой список инициализации Pin{} - создание экземпляра класса Pin с конструктором по умолчанию ControlWay{Pin{}} - создание экземпляра класса ControlWay, конструктор принимает ссылку на объект класса Pin union тут не используется |
|
|
Litkevich Yuriy |
2.1.2021, 1:22
Сообщение
#6
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
|
|
|
Алексей1153 |
2.1.2021, 13:12
Сообщение
#7
|
фрилансер Группа: Участник Сообщений: 2941 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: 34 |
Litkevich Yuriy, можно сказать, что ничем, но в редких случаях компилятор может перепутать с синтаксисом вызова или объявления функции. Со списком инициализации всё всегда однозначно
|
|
|
AlexandrVol |
9.9.2023, 0:18
Сообщение
#8
|
Новичок Группа: Неактивирован Сообщений: 1 Регистрация: 8.9.2023 Пользователь №: 5338 Спасибо сказали: 0 раз(а) Репутация: 0 |
|
|
|
Текстовая версия | Сейчас: 26.12.2024, 22:06 |