我有两种类型的课程:
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
并没有成功,因为除非我弄错,否则仍然需要将存储库转换为所需的类型。
对于使存储库系统抽象的方法的任何指导,将不胜感激。
答案 0 :(得分:4)
即使它们的名称相似,Repository<A>
和Repository<B>
也是完全不同的类型。您需要使它们共享一个通用类型,例如:
class RepositoryBase { /*virtuals etc*/ };
template <typename T>
class Repository : public RepositoryBase
{};