C++类型检查

C++Type inspection

我有一个c++ class:

Class farm {


...
protected:
vector<ff_node*> workers;
};

//ff_node an abstract method representing a single thread
class ff_node {
protected:
   //svc is the method to encapsulate a sequential function
   void* svc(void *)=0;

};

Class farm_withMoreWorkers: public farm {
void addWorker(){
  ff_node *newWorker;

  newWorker=new ff_node();// rather than adding ff_node make the instance type as that of type workers since ff_node is abstract
  farm:: workers.push_back(newWorker);
}
};

class ff_node 是抽象的。为了再添加一个工人,我需要创建一个类型与其他实例相同的新实例(所有工人都属于同一类型) 有没有办法获取特定类型的(其中一个)工人并创建该类型的实例?!

你提供的信息很少,所以我在猜测你到底想要什么。假设有一个抽象(纯虚)class

class worker { /* define some useful virtual interface */ };

并且您想使用多个多态性来使用多个不同的 worker。然后最好将它们保存在 unique_ptrvector 中,这样在 vector 范围的末尾,worker 会自动 deleted。您可以通过直接从用户提供的参数构造它来添加一个新的工人。由于在定义 farm 时甚至可能不知道新工人的类型,因此必须以 template 的形式提供此功能。例如

class farm
{
  std::vector<std::unique_ptr<worker>> workers; //
public:
  // constructs new worker of type Worker with arguments provided
  template<typename Worker, typename... Args>
  void add_worker(Args&&...args)
  { workers.emplace_back(new Worker(std::forward<Args>(args)...)); }
};

并像这样使用它

struct builder : public worker
{
  builder(string const&, const widget*, some_type);
  /* ... */
};

farm the_farm;
widget w( /* ... */ );
some_type x;
the_farm.add<builder>("the new builder", &w, x);

请注意,在对 farm::add() 的调用中,只需提供第一个模板参数,其他将从函数参数中推导出来。

在基 class 中创建一个纯虚拟克隆函数并在每个派生 class 中覆盖它。

class ff_node
{
 public:
 virtual ff_node* clone() = 0;
};

class ff_child : public ff_node
{
 public:
 ff_node* clone() override {new ff_child;}
};

现在,给定一个 ff_node* node,您可以通过调用 node->clone().

创建相同运行时类型的另一个实例