具有可变参数模板参数的确定方法

问题描述 投票:0回答:1

我想定义一个可变参数模板类BaseA,它具有可变函数execute(...)。子类使用确定的参数扩展execute(...)

我尝试了一个演示代码,但是它具有类型转换错误,如何收集所有子类并使用execute

#include <iostream>
#include <string>
#include <vector>

using namespace std;

// template base class A
template <typename ... Types>
class BaseA{
    virtual int execute(Types ...) = 0;
};

// subclass 1
class SubA1:public BaseA<int>{
    int execute(int b) override {
        //...
        return 0;
    }
};

// subclass 2
class SubA2:public BaseA<int, string>{
    int execute(int b, string c) override {
        //...
        return 0;
    }
};

int main() {
    vector<BaseA<> *> as(2);
    as[0] = (BaseA<int> *) new SubA1(); // type conversion error here
    as[0]->execute(1);

    return 0;
}

感谢任何想法。

c++ variadic
1个回答
0
投票

创建向量时*> as(2);您期望向量可以接受任何类型。我认为这在C ++中是错误的。向量只能接受类型。

当您使用模板实例化基类类型时,编译器将为您生成以下类层次结构。

class BaseA_int {
  public:
virtual int execute(int) = 0;
  };

 // subclass 1
 class SubA1 :public BaseA_int {
  public:
int execute(int b) override {
    //...
    return 0;
}
 };

  class BaseA_int_string
  {
    public:
  virtual int execute(int, string) = 0;
   };

  // subclass 2
  class SubA2 :public BaseA_int_string {
int execute(int b, string c) override {
    //...
    return 0;
}
  };

并且在这里您可以看到派生类使用不同的基类。由于向量只能是Base <> *类型,但是您正在为其分配Base类型,因此编译器会出错。

因此,基和基完全是两个不同的基类。

以下内容将编译,没有任何问题,但是它不能接受Base

#include <iostream>
#include <string>
#include <vector>

using namespace std;

// template base class A
template <typename ... Types>
class BaseA {
 public:
virtual int execute(Types ...) = 0;
};

// subclass 1
class SubA1 :public BaseA<int> {
int execute(int b) override {
    //...
    return 0;
}
 };

 // subclass 2
  class SubA2 :public BaseA<int, string> {
int execute(int b, string c) override {
    //...
    return 0;
}
  };


  int main() {
vector<BaseA<int> *> as(2);
as[0] = (BaseA<int> *) new SubA1(); // type conversion error here
as[0]->execute(1);

return 0;
   }
© www.soinside.com 2019 - 2024. All rights reserved.