让我们更具体地了解一下我在做什么。我有一个抽象的 Optimizer 类,定义了各种算法的接口(interface)。它的工作原理是生成和消耗未知数量的称为请求的数据结构,因此我让它使用它们的 vector 。
class Request {
public:
vector<double> x;
double y;
int id;
// [...]
}
class Asynch_Optimizer {
public:
virtual int generate_requests( vector<Request> & work ) = 0;
virtual int assimilate_results( const vector<Request> & result ) = 0;
protected:
virtual void convergence_test( const vector<Request> & population );
// [...]
}
事实证明,Particle_Swarm_Optimizer 可以在请求中使用一些附加字段。 (我在这里闻到了我的谬论,它仅在内部使用附加字段。对于请求处理机制来说,它没有任何意义。我将其子类化为 Particle 只是为了将所有内容很好地绑定(bind)在一起)
class Particle : public Request {
public:
vector<double> v;
vector<double> x_min;
double min_value;
// [...]
}
现在我想调用通用的收敛测试方法,该方法在 Particle_Swarm_Optimizer 的父类(super class)中实现,其中数据位于粒子 vector 中。有没有比构建新 vector 并单独复制每个元素更有效的方法来转换为请求 vector :
void opti::Particle_Swarm_Optimizer::convergence_test( const vector<Particle> & population )
{
//TODO remove slow hack
vector<Request> cast_up;
for (size_t i = 0; i < population.size(); i++) {
cast_up.push_back( population[i] );
}
Asynch_Optimizer::convergence_test( cast_up );
}
我认为有更好的方法来构建此示例的数据。我仍然很好奇是否存在一种方法可以向上转换容器的模板类型?
最佳答案
即使您在容器中使用指针,也无法完成此操作。而且有充分的理由不这样做。
即使SubClass
是 BaseClass
的子类型, vector<SubClass*>
是不正确的是 vector<BaseClass*>
的子类型。这就是为什么这不可能成立(对于任何类型的容器,而不仅仅是 vector ):
假设vector<SubClass*>
被视为 vector<BaseClass*>
的子类,并假设有第二类 OtherSubClass
也源自BaseClass
。考虑这段代码
// This looks logical and is type-safe.
void InsertElement(vector<BaseClass*>& container, BaseClass* element) {
container.push_back(element);
}
int main() {
vector<SubClass*> subclass_container;
// Ok, fine, inserting a SubClass pointer into a vector of
// SubClass pointers.
SubClass subclass_obj;
InsertElement(subclass_container, &subclass_obj);
// But what about this? Now we're able to insert an
// OtherSubClass pointer into that same container!
OtherSubClass othersubclass_obj;
InsertElement(subclass_container, &othersubclass_obj);
// Suddenly, we have a SubClass* that actually points at an
// OtherSubClass object, when these two are siblings!
SubClass* subclass_ptr = subclass_container[1];
}
如果你采用 vector<SubClass*>
的想法,你最终会得到什么?应被视为 vector<BaseClass*>
的子类是两段代码,它们显然是类型安全的,但最终允许您以编译器无法检测到的方式违反类型安全。
关于c++ - 当 T2 是 C++ 中 T1 的子类时,如何使用 vector <T2>代替 vector <T1>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13662504/