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

How do i structure templates so they're polymorphic?

我有两种class:

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

我想创建一个界面,它可以 return 这些 class 中的任何一种类型,例如:

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

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

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 但没有成功,因为除非我弄错了,否则我仍然需要将存储库转换为我需要的类型。

任何有关使此存储库系统抽象的方法的指导将不胜感激。

虽然名字相似,但Repository<A>Repository<B>是完全不同的类型。你需要让它们共享一个共同的类型,比如:

class RepositoryBase { /*virtuals etc*/ };

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