c++ - 当 T2 是 C++ 中 T1 的子类时,如何使用 vector <T2>代替 vector <T1>?

标签 c++ templates casting polymorphism

让我们更具体地了解一下我在做什么。我有一个抽象的 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 );
}

我认为有更好的方法来构建此示例的数据。我仍然很好奇是否存在一种方法可以向上转换容器的模板类型?

最佳答案

即使您在容器中使用指针,也无法完成此操作。而且有充分的理由不这样做。

即使SubClassBaseClass 的子类型, 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/

相关文章:

c++ - 在模板中隐式获取字符串的长度

c - 如何从文本文件中将数据作为字符读取,然后将每个字符除以一个 int

java - Java 中 <T> 和 <T extends Object> 有什么区别?

c - 加倍和递增的性能差异

c++ - char (& test(...))[2] 是什么意思

c++ - 绝对值排序,使用自定义比较器

c++ - 分配和释放内存 C++

c++ - C++ 中的幂函数

c++ - 这个条件如何放在模板偏特化中?

c++ - 使用引用推导模板包中的冲突类型