Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何强制两个具有相同模板类型的函数参数?_C++_Templates_Inheritance_Polymorphism - Fatal编程技术网

C++ 如何强制两个具有相同模板类型的函数参数?

C++ 如何强制两个具有相同模板类型的函数参数?,c++,templates,inheritance,polymorphism,C++,Templates,Inheritance,Polymorphism,我正在尝试创建一个注册表,在该注册表中,我可以注册具有相关传感器处理阶段的传感器 TLDR:我如何强制两个函数参数具有一个通用的模板参数/成员类型,其中两个参数都继承自抽象类,并且可以放置到接受从这些抽象类派生的任何对象的集合中 理想情况下,我想要这样的东西 // registry map<string, Sensor> sensors; map<string, SensorProcessing> processors; // sensor base class cla

我正在尝试创建一个注册表,在该注册表中,我可以注册具有相关传感器处理阶段的传感器

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; }

当然,这并不是那么简单,因为
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?如何确定对象数据类型?