Пытаюсь понять, как можно в С++ реализовать полиморфизм времени компиляции для следующей задачи.
Имеется шина 1-Wire (из названия понятно, что она однопроводная, несчитая общего проводника).
Имеется N устройств на этой шине.
Шина должна знать какие устройства на ней есть.
Устройства должны знать на какой шине сидят.
Устройства пользуются функциями-членами шины для выполнения своих задач.
class OneWireDevice;
class OneWire
{
bool addDevice(OneWireDevice *device);
bool removeDevice(OneWireDevice *device);
List<OneWireDevice *> deviceList(); // List - предполагаемый шаблонный контейнерный класс
void foo();
}
class OneWireDevice
{
OneWireDevice(OneWire *awire = 0);
OneWire* wire();
void bar()
{
wire()->foo();
}
}
class OneWire {...};
// -1-
class OneWirePin: public OneWire
{
OneWirePin(Pin *pin);
};
//...
Pin *pin = new Pin();
OneWirePin *wire(pin);
// -2-
class OneWireUart: public OneWire
{
OneWireUart(Uart *uart);
};
//...
Uart *uart = new Uart();
OneWirePin *wire(uart);
// -3-
class OneWireUartPin: public OneWire
{
OneWireUartPin(SoftUart *uart)
};
//...
Pin *pin = new Pin();
SoftUart *uart = new SoftUart(pin);
OneWirePin *wire(uart);
// -1-
Pin *pin = new Pin();
OneWire *wire = new OneWire<Pin *>(pin);
// или
Pin pin;
OneWire *wire = new OneWire<Pin>(pin);
// -2-
UART *uart = new Uart();
OneWire *wire = new OneWire<UART *>(uart);
// или
UART uart;
OneWire *wire = new OneWire<UART >(uart );
// -3-
SoftUART *uart = new SoftUART();
OneWire *wire = new OneWire<SoftUART *>(uart);
// или
SoftUART uart;
OneWire *wire = new OneWire<SoftUART>(uart );
https://onlinegdb.com/r1J-2ctTv
#include <iostream>
#include <variant>
#include <algorithm>
#include <vector>
class EmptyDevice
{
public:
void print_me()const
{
std::cout<<"EmptyDevice"<<'\n';
}
};
class Pin
{
public:
void print_me()const
{
std::cout<<"Pin"<<'\n';
}
};
class UART
{
public:
void print_me()const
{
std::cout<<"UART"<<'\n';
}
};
class SoftUART
{
public:
void print_me()const
{
std::cout<<"SoftUART"<<'\n';
}
};
using ControlWay=std::variant<EmptyDevice,Pin,UART,SoftUART>;
class DeviceList
{
std::vector<ControlWay*> m_list;
public:
bool addDevice(ControlWay* device)
{
m_list.push_back(device);
return true;
}
bool removeDevice(ControlWay* device)
{
m_list.erase(std::remove(m_list.begin(),m_list.end(),device),m_list.end());
return true;
}
void print_me()const
{
for(auto* d:m_list)
{
std::visit([](auto& device)
{
device.print_me();
},*d);
}
}
};
int main()
{
DeviceList m_DeviceList;
m_DeviceList.addDevice(new ControlWay{Pin{}});
m_DeviceList.addDevice(new ControlWay{UART{}});
m_DeviceList.addDevice(new ControlWay{SoftUART{}});
m_DeviceList.print_me();
//m_DeviceList.removeDevice(d1);
//m_DeviceList.removeDevice(d2);
//m_DeviceList.removeDevice(d3);
//не забыть сделать освобождение памяти либо заюзать std::unique_ptr
return 0;
}
Litkevich Yuriy, можно сказать, что ничем, но в редких случаях компилятор может перепутать с синтаксисом вызова или объявления функции. Со списком инициализации всё всегда однозначно
Кста, полезные курсы для программирования на c# можно найти на https://ggsel.net
Кста, полезные курсы для программирования на c# можно найти на https://ggsel.net
Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)