我如何构造模板以使其具有多态性?

时间:2019-08-27 12:21:50

标签: c++ templates metaprogramming

我有两种类型的课程:

Repository<A> a;
Repository<B> b;

我想创建一个接口,该接口可以返回这些类型的任何一种,例如:

class RepositoryInterface {
   virtual Repository<*> getRepository() = 0;
}

然后我想要两个类来实现。例如:

class RepositoryA : RepositoryInterface {
  public:
  virtual Repository<A> getRepository();
}

class RepositoryB : RepositoryInterface {
  public:
  virtual Repository<B> getRepository();
}

存储库将按以下方式使用:

class example {

   run(int x){
    auto repository = repositoryLookup(x);

    repository.deleteAll();
   }

   Repository<*> repositoryLookup(int x) {
     if ( x == 1 ) {
       return Repository<A>();  
     } else {
       return Repository<B>();
     }
   }

}

我要这样做的原因是要启用一个模块化的存储库系统,任何人都可以在无需修改run函数的情况下插入存储库。我尝试使用boost::any并没有成功,因为除非我弄错,否则仍然需要将存储库转换为所需的类型。

对于使存储库系统抽象的方法的任何指导,将不胜感激。

1 个答案:

答案 0 :(得分:4)

即使它们的名称相似,Repository<A>Repository<B>也是完全不同的类型。您需要使它们共享一个通用类型,例如:

class RepositoryBase { /*virtuals etc*/ };

template <typename T>
class Repository : public RepositoryBase 
{};