C++;型式检验 我有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;
类ff_节点是抽象的。为了再添加一个worker,我需要创建一个与其他worker类型相同的新实例(所有worker的类型都相同)C++;型式检验 我有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;,c++,reflection,rtti,C++,Reflection,Rtti,类ff_节点是抽象的。为了再添加一个worker,我需要创建一个与其他worker类型相同的新实例(所有worker的类型都相同) 有没有办法获取(其中一个)特定类型的worker并创建该类型的实例 你提供的信息很少,所以我猜测你到底想要什么。假设有一个抽象(纯虚拟)类 您需要使用几个多态性来使用几个不同的worker。然后最好将它们保存在唯一的向量中,这样在向量的范围结束时,工作人员将自动删除d。您可以通过直接从用户提供的参数构造新的辅助进程来添加它。由于在定义农场时甚至可能不知道新工人的类型
有没有办法获取(其中一个)特定类型的worker并创建该类型的实例 你提供的信息很少,所以我猜测你到底想要什么。假设有一个抽象(纯虚拟)类 您需要使用几个多态性来使用几个不同的worker。然后最好将它们保存在
唯一的向量中,这样在向量的范围结束时,工作人员将自动删除d。您可以通过直接从用户提供的参数构造新的辅助进程来添加它。由于在定义农场时甚至可能不知道新工人的类型
,因此必须以模板
的形式提供此功能。比如说
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)...)); }
};
类场
{
病媒工作者//
公众:
//使用提供的参数构造worker类型的新worker
模板
void add_worker(Args&&…Args)
{workers.emplace_back(新Worker(std::forward(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);
结构生成器:公共工作者
{
生成器(字符串常量,常量小部件*,某些类型);
/* ... */
};
农场;;
小部件w(/*…*/);
某些类型的x;
_farm.add(“新构建者”&w,x);
请注意,在对farm::add()
的调用中,仅必须提供第一个模板参数,其他参数将从函数参数推导而来。在基类中创建纯虚拟克隆函数,并在每个派生类中重写它
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()
来创建相同运行时类型的另一个实例。请提供更多信息。似乎ff_节点
不是一个抽象类(因为您可以新建ff_节点();
),但如果有审查者
,则毫无意义。特定类型的工作者
是向量
。你到底希望完成什么?
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);
class ff_node
{
public:
virtual ff_node* clone() = 0;
};
class ff_child : public ff_node
{
public:
ff_node* clone() override {new ff_child;}
};