C ++类型检查

时间:2015-03-09 15:00:32

标签: c++ reflection rtti

我有一个c ++类:

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);
}
};

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

2 个答案:

答案 0 :(得分:0)

你提供的信息很少,所以我猜测你真正想要的是什么。假设有一个抽象(纯虚拟)类

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

并且您希望使用多个多态来使用多个不同的工作者。然后,您最好将它们保持在vector unique_ptr,以便在vector范围的末尾,工作人员自动delete d。您可以通过从用户提供的参数直接构造新工作程序来添加它。由于在定义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()时,只能提供第一个模板参数,其他模板参数将从函数参数中推断出来。

答案 1 :(得分:0)

在基类中创建纯虚拟克隆函数,并在每个派生类中重写它。

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()来创建相同运行时类型的另一个实例。