Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.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

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_Enums - Fatal编程技术网

C++ 在函数参数中传递几种类型的类

C++ 在函数参数中传递几种类型的类,c++,templates,enums,C++,Templates,Enums,我有一个枚举类: enum Info { TYPE_1, TYPE_2 }; 根据信息的类型,我必须创建我拥有的两个不同类中的一个:Demo1、Demo2,然后将其传递给一个函数句柄,该句柄将处理这些内容。这两个类具有相同的特征。现在我在我的枚举上做了一个if/elseif,然后我为每个调用2个单独的函数。。。但是这两个函数做同样的事情。。。我想创建一个模板函数,它可以作为一个或另一个类的参数,但我无法创建它 if (Info == TYPE_1) { Demo1 d1;

我有一个枚举类:

enum Info
{
  TYPE_1,
  TYPE_2
};
根据信息的类型,我必须创建我拥有的两个不同类中的一个:Demo1、Demo2,然后将其传递给一个函数句柄,该句柄将处理这些内容。这两个类具有相同的特征。现在我在我的枚举上做了一个if/elseif,然后我为每个调用2个单独的函数。。。但是这两个函数做同样的事情。。。我想创建一个模板函数,它可以作为一个或另一个类的参数,但我无法创建它

if (Info == TYPE_1)
{
    Demo1 d1;
    handle1(d1);
}
else if (Info == TYPE_2)
{
    Demo2 d2;
    handle2(d2);
}

对于更好的编码风格,我有什么选择? 是否可以创建一个模板类=Demo1或Demo2,然后将此模板类传入参数中以传递给唯一的函数句柄


谢谢

不清楚,但我认为您正在寻找这样简单的东西:

template<typename T>
  void handle(T &t)
{
   t.getName();
}

与单独的handle1和handle2不同,handle1和handle2似乎是多态性的一个很好的候选者

class DemoAbs {
  public:
    void getName() = 0;
};

class Demo1 public DemoAbs {
  public:
    void getName() { //impl here }
};

class Demo2 public DemoAbs {
  public:
    void getName() { //impl here }
}

DemoAbs *demo = 0;
if (Info == TYPE_1) {
  demo = new Demo1();
} else if(Info == TYPE_2) {
  demo = new Demo2();
}

handle(demo);

void handle(DemoAbs *demo) {
  demo->getName();
}

希望这能传达这个想法。

这些类型是继承层次结构的一部分,还是恰好具有相同接口或至少有一个子集相同的完全不相关的类型?信息是运行时值还是编译时值?这部分在父类父类的函数Parent::func中,Demo1和Demo2是父级的子级,它们是在Parent::func中创建的。Info是父项的枚举优先级。我不知道是否有更好的封装方法…谢谢,这实际上是一个非常简单的方法来解决我的问题!我想在我的类Parrent中将这个函数句柄原型化为函数类。即使这个函数也是一个模板,我也可以这样做吗?模板函数可以是一个类的成员,是的。
handle(d1);
...
handle(d2);
class DemoAbs {
  public:
    void getName() = 0;
};

class Demo1 public DemoAbs {
  public:
    void getName() { //impl here }
};

class Demo2 public DemoAbs {
  public:
    void getName() { //impl here }
}

DemoAbs *demo = 0;
if (Info == TYPE_1) {
  demo = new Demo1();
} else if(Info == TYPE_2) {
  demo = new Demo2();
}

handle(demo);

void handle(DemoAbs *demo) {
  demo->getName();
}