我有两个班Foo
和Bar
。我有一个数据加载器,它从文件加载数据并以Foo
或Bar
的形式返回。
目前,我的解决方案为:
struct Foo {
std::vector<Foo> Filter() {
//do something with data and return new Foo's
}
std::vector<int> data;
}
struct Bar : protected Foo {
std::vector<Bar> Filter() {
//do something with data and return new Bar's
}
}
template <typename T>
DataLoader<T> {
....
T & Get() { ... }
}
其中T
是Foo
或Bar
。
此解决方案的问题是我无法动态选择返回Foo
或Bar
。我必须重新加载数据。虚方法的使用无效,因为Filter
具有不同的返回类型。另外,也不可以公开继承,因为在那种情况下,我可以执行我不想启用的Foo f = Bar();
。
我想出了使用多重继承的解决方案。但是,我不确定这是正确的还是会产生不确定的行为。
我已将私有课程添加到DataLoader
:
struct FooBarStorage : virtual public Foo, public Bar {}
,并将Bar
中的继承更改为struct Bar : virtual protected Foo
。
现在我可以拥有非模板化的DataLoader
:
class DataLoader {
template <typename T> T & Get() { ... }
}
并专门化Get
以返回Bar &
或Foo &
。好处是,我只能加载一次数据并决定在运行时返回什么。在以前的解决方案中,数据以给定类型(Foo
或Bar
)加载,但我无法更改类型。
这是可行的解决方案还是会产生不确定的行为/其他问题/性能影响?