Я пытаюсь создать реестр, в котором я могу зарегистрировать датчики с соответствующими этапами обработки датчиков.
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()
являются базовыми типами, и я не могу во время компиляции проверить, согласуются ли они с используемым типом данных без шаблонов. Однако я не уверен, как это сделать, а также поместить датчики и процессоры в свои собственные иерархии классов.