如何创建模板数组 - c++

How to create array of templates - c++

本文关键字:c++ 数组 何创 建模      更新时间:2023-10-16

我创建了一个带有模板的优先级队列类。将其命名为PQ。如何创建一个 PQ 数组,其中每个元素都是不同类型的 PQ?

尝试做这样的事情,但没有奏效:

    template <class T>
PQ<T> *arr[10]; //void pointer can point to everything
arr[0] = new PQ<string>;
arr[1] = new PQ<int>;

编辑1:

我添加了
法典

 template <class T>
class PQ : public Pointer_Base

  class Pointer_Base
{
public:
    virtual ~Pointer_Base();//virtual DTOR
   virtual void showall();
};

然后在主要我写道:

Pointer_Base * arr[2];
PQ<string> first;
PQ<int> second;
arr[0] = first;

它说 arr[0]=first 行上的错误:

"没有合适的从 PQ 到 Pointer_base* 的转换"

如果我实现了虚拟函数,为什么会出现此错误?附言: showall 函数只是在队列上运行并打印其中的所有值及其优先级。我知道我可能已经用 cout 和运算符重载完成了它,但现在这样做对我来说更容易、更快捷。

似乎是让PQ类从基类继承并存储类型为Base*std::vectorstd::array的完美候选者。然后,您的PQ类将需要实现 Base 中定义的一些虚函数。 这样的东西可能适合您的需求:

class base
{
  public:
    // virtual functions that every PQ must implement
     virtual ~base() {}
};
template<class T>
class PQ : public base
{
   // implement the virtual functions
};

然后要使用它,您将使用类似以下内容:

std::vector<base*> priority_queues; // or even std::unique_ptr<base>

但是,如果您只需要在整个项目的一小部分中执行此操作,则必须使PQ的所有实例都使用虚函数调用是没有意义的。您可以通过拥有一个包装类来解决此问题,假设wrap<T>从上述base继承并且它在内部保存PQ<T>。然后,包装类可以将函数调用委托给内部结构。这样,您只需在需要时为虚拟功能付费,而不是在整个项目中付费。

此外,由于您的混合类型在这里,我

假设您稍后还将在项目中混合类型,为此我建议使用 boost::any .