[英]Class template with constructor forwarding
我想知道什么是实现以下内容的最佳方法。
我有许多从抽象类BaseClass
派生的类。 我想创建一个新类ParallelBaseClass
,该类基本上对BaseClass
的所有子级执行并行BaseClass
。
我想到的设计是这样的:
template <class D>
class ParallelBaseClass
{
private:
std::vector<D> _classes;
public:
ParallelBaseClass(int threads, constructor_args)
{
for(int i = 0; i < threads; i++)
_classes.push_back(D(constructor_args));
}
}
但是,我不知道这是最好的设计。 我有两个问题:
BaseClass
的后代 任何指导,不胜感激。
谢谢!
以下内容可能会有所帮助:
template <class Base>
class ParallelBaseClass
{
private:
std::vector<std::unique_ptr<Base>> classes;
public:
template<typename Derived, typename ... Ts>
void Add(Ts&&...args)
{
classes.push_back(std::make_unique<Derived>(std::forward<Ts>(args)...));
}
};
用法:
struct B { virtual ~B() = default; };
struct D : B { D(int) {} };
ParallelBaseClass<B> p;
p.Add<D>(42);
如果这些类都具有一个可以execute
某些功能的函数(例如execute
),并且ParallelBaseClass
应该在不同线程中的多个对象上同时调用它,则可能是一种设计:
#include <utility> // for std::forward
class Base {
public:
virtual void execute() = 0;
}
class Example : public Base {
public:
void execute() override { .... }
}
template<typename D>
class Parallel : public Base {
private:
std::vector<D> objects_; // Called objects, since classes refers to the type and not instances of it
public:
template<typename... Args>
explicit ParallelBase(int threads, Args&&... args) {
for(int i = 0; i < threads; ++i)
objects_.emplace_back( args... );
// not using std::forward<Args>(args)... here:
// need to make (multiple) copies instead of moving
}
void execute() override {
for(D& obj : objects_)
//create thread and run objects_[i].execute()
}
}
构造函数是可变参数的模板函数,它将参数转发给D
的构造函数。 std::forward
比作为右值引用或尽可能的引用std::forward
转发。 ...
展开模板参数包。 explicit
确保使用零args
参数的构造将int
不能隐式转换为ParallelBase
。
这里的Base
是抽象的和多态的。 这将对应于构图设计模式。 Parallel
(此处不是基类)对应于D
的功能的并行化,并且本身具有execute
实现。
更新固定的移动构造。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.