我如何构造模板以使其具有多态性?
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
{};
我有两种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
{};