[英]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.