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