Я пытаюсь создать реестр, в котором я могу зарегистрировать датчики с соответствующими этапами обработки датчиков.
TLDR: Как заставить два параметра функции иметь общий параметр шаблона / тип элемента, где оба наследуются от абстрактных классов и могут быть помещены в коллекции, которые принимают любые объекты, производные от этих абстрактных классов?
В идеале я бы хотел что-то вроде этого
// registry
map<string, Sensor> sensors;
map<string, SensorProcessing> processors;
// sensor base class
class Sensor
{
virtual Data sense();
}
// processing base class
class SensorProcessing
{
virtual void process(Data d);
}
// data kind base class
struct Data { string name; }
, где Sensor
и SensorProcessing
- абстрактные типы.
В идеале, коллекция должна принимать любой производный тип датчика или обработки.
Когда я регистрирую датчик и этап обработки, я хотел бы обеспечить, чтобы объект SensorProcessing
мог обрабатывать данные, полученные объектом Sensor
, с которым он зарегистрирован.
Например, не имеет смысла связывать этап обработки, работающий с изображениями, с датчиком, который выдает лазерное сканирование.
Как-то так для регистрации было бы неплохо:
void register_sensor(string name, Sensor s, SensorProcessing p)
{
// enforce that p eats what s produces, in a typesafe but polymorphic manner
static_assert(std::is_same<s::data_type, p::data_type>);
}
Но, конечно, все не так просто, потому что аргументы register_sensor()
являются базовыми типами, и я не могу во время компиляции проверить, что они согласуются с типом данных, который они используют, без шаблонов. Однако я не уверен, как это сделать, а также помещать датчики и процессоры в свои собственные иерархии классов.