C++ 如何强制两个具有相同模板类型的函数参数?
我正在尝试创建一个注册表,在该注册表中,我可以注册具有相关传感器处理阶段的传感器 TLDR:我如何强制两个函数参数具有一个通用的模板参数/成员类型,其中两个参数都继承自抽象类,并且可以放置到接受从这些抽象类派生的任何对象的集合中 理想情况下,我想要这样的东西C++ 如何强制两个具有相同模板类型的函数参数?,c++,templates,inheritance,polymorphism,C++,Templates,Inheritance,Polymorphism,我正在尝试创建一个注册表,在该注册表中,我可以注册具有相关传感器处理阶段的传感器 TLDR:我如何强制两个函数参数具有一个通用的模板参数/成员类型,其中两个参数都继承自抽象类,并且可以放置到接受从这些抽象类派生的任何对象的集合中 理想情况下,我想要这样的东西 // registry map<string, Sensor> sensors; map<string, SensorProcessing> processors; // sensor base class cla
// 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; }
当然,这并不是那么简单,因为
register\u sensor()
的参数是基本类型,我无法在编译时检查它们是否同意不使用模板的数据类型。但是,我不知道如何做到这一点,也不知道如何将传感器和处理器放入它们自己的类层次结构中。有一些选项
- 如果不是在Windows下,请使用或类似的方法
- 使用(C++17)
- 使用基于COM的接口以及COM注册和类型库来处理所有这些已经为您完成的工作
- 使用通用格式(JSON、XML)的可序列化对象
- 如果不是在Windows下,请使用或类似的方法
- 使用(C++17)
- 使用基于COM的接口以及COM注册和类型库来处理所有这些已经为您完成的工作
- 使用通用格式(JSON、XML)的可序列化对象
- 有一些选择
template <typename TSensor, typename TProcessing, typename = std::enable_if_t<std::is_base_of_v<Sensor, TSensor> && std::is_base_of_v<SensorProcessing, TProcessing>>>
void register_sensor(std::string const& name, TSensor s, TProcessing p)
{
// enforce that p eats what s produces, in a typesafe but polymorphic manner
static_assert(std::is_same_v<typename TSensor::data_type, typename TProcessing::data_type>, "Data type missmatch");
// create the pointers here and move s and p in
}
模板
无效寄存器\传感器(标准::字符串常量和名称、传感器s、t处理p)
{
//强制p以类型安全但多态的方式吃s产生的东西
静态断言(std::is_same_v,“数据类型不匹配”);
//在此处创建指针并将s和p移入
}
请注意,这将创建传入的传感器和传感器处理对象的副本
这是一种可能的实现。我不确定您所描述的容器想要实现什么,因此我选择了一个从我的角度来看有意义的容器。如果在函数调用中创建指针,您可以在编译时检查数据类型:
template <typename TSensor, typename TProcessing, typename = std::enable_if_t<std::is_base_of_v<Sensor, TSensor> && std::is_base_of_v<SensorProcessing, TProcessing>>>
void register_sensor(std::string const& name, TSensor s, TProcessing p)
{
// enforce that p eats what s produces, in a typesafe but polymorphic manner
static_assert(std::is_same_v<typename TSensor::data_type, typename TProcessing::data_type>, "Data type missmatch");
// create the pointers here and move s and p in
}
模板
无效寄存器\传感器(标准::字符串常量和名称、传感器s、t处理p)
{
//强制p以类型安全但多态的方式吃s产生的东西
静态断言(std::is_same_v,“数据类型不匹配”);
//在此处创建指针并将s和p移入
}
请注意,这将创建传入的传感器和传感器处理对象的副本
这是一种可能的实现。我不确定你用你所描述的容器来达到什么目的,所以我从我的观点中选择了一个有意义的。你使用哪种C++版本?目前11,但是我对新版本的建议开放。如果你有选择,就去最新的标准,即C++ 17 ATM。理想的是,集合应接受任何派生类型的传感器或处理。映射的值类型需要是基类指针才能使用多态性。比如
map传感器代码>。然后,您可以将一个指向从传感器派生的任何类型的对象的指针插入到这样的映射中。您需要一个描述您想要实现的目标的指针。为什么不能将多态参数传递给register\u sensor?对象数据类型是如何确定的?你使用的是哪个C++版本?目前11,但是我对新版本的建议开放。如果你有选择,总是去最新的标准,即C++ 17 ATM。理想的是,集合应该接受任何派生类型的传感器或处理。映射的值类型需要是基类指针才能使用多态性。比如map传感器代码>。然后,您可以将一个指向从传感器派生的任何类型的对象的指针插入到这样的映射中。您需要一个描述您想要实现的目标的指针。为什么不能将多态参数传递给register\u sensor?如何确定对象数据类型?