簡體   English   中英

具有私有初始化的C ++構造函數

[英]C++ constructor with private initialization

不知道是否曾經問過這個問題。 我正在實施工廠課程。 每個實例都應繼承自InstBase基類,並應通過集中工廠進行初始化。

class InstBase {
  friend class Factory;      

  private:
    InstBase() = default;
    factory* factory;
}


class Factory {

   template <typename Derived, typename... ArgsT>
   InstBase* get(ArgsT&&... args) {
     return new Derived(std::forward<ArgsT>(args)...)                     
   }

}

class MyInst : public InstBase {
   public:
   MyInst(int a, int b) {...};
}

factory.get<MyInst>(1, 2);

如本例所示,該接口將Derived作為模板,並使用傳遞給Derived的構造函數的用戶定義參數列表初始化實例。 但是,我想在這里添加的是將指針分配給創建實例的工廠。 這可以通過以下方式完成:

   template <typename Derived, typename... ArgsT>
   InstBase* get(ArgsT&&... args) {
     auto ptr = new Derived(std::forward<ArgsT>(args)...);
     ptr->factory = this;
     return ptr;                    
   }

我覺得這有點多余,因為基類InstBase總是在派生類之前創建,並且只能由工廠類更新。 在不更改get接口的情況下,是否有任何技巧可以實現此目標? 對於我來說,讓用戶在參數列表中附加另一個指向factory指針(例如factory.get<MyInst>(1, 2, &factory) )是沒有意義的。

如果要禁止將Factory用作參數的類型,則可以使用類似以下內容(符合C ++ 11):

template<typename>
constexpr bool isBaseOf() { return false; }

template<typename T, typename U, typename... O>
constexpr bool isBaseOf() { return std::is_base_of<T, typename std::decay<U>::type>::value || isBaseOf<T, O...>(); }

因此,更改工廠方法如下:

template <typename Derived, typename... ArgsT>
InstBase* get(ArgsT&&... args) {
    static_assert(not isBaseOf<Factory, ArgsT...>(), "!");
    return new Derived(std::forward<ArgsT>(args)...)                     
}

就是說,我不太喜歡它,因為我不會使用不允許我使用所需參數的類!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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