簡體   English   中英

具有構造函數轉發的類模板

[英]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));
   }
}

但是,我不知道這是最好的設計。 我有兩個問題:

  1. 確保模板類型是BaseClass的后代
  2. 轉發構造函數參數,如上所示。

任何指導,不勝感激。

謝謝!

以下內容可能會有所幫助:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM