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_ptr
的 vector
中,这样在 vector
范围的末尾,worker 会自动 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()
的调用中,只需提供第一个模板参数,其他将从函数参数中推导出来。
在基 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()
.
创建相同运行时类型的另一个实例
我有一个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_ptr
的 vector
中,这样在 vector
范围的末尾,worker 会自动 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()
的调用中,只需提供第一个模板参数,其他将从函数参数中推导出来。
在基 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()
.