我有一個模板類Container
與定義模板的構造函數的默認constructible類如下:有條件構建一個參數包
template<class... Objects>
class Container
{
public:
template<class... Objs>
Container(Objs*... objs)
{
// initialize all pointers of m_objs to nullptr
objs_init<Objects...>();
// initialize the pointers of m_objs corresponding to parameters pack objs...
objs_init<Objs...>(objs...);
}
private:
template<class Obj, class O1, class ...On>
void objs_init()
{
objs_init<Obj>();
objs_init<O1, On...>();
}
template<class Obj, class O1, class ...On>
void objs_init(Obj* obj, O1* o1, On*... on)
{
objs_init<Obj>(obj);
objs_init<O1, On...>(o1, on...);
}
template<class Obj>
void objs_init(Obj* obj = nullptr)
{
std::get<Obj*>(m_objs) = obj;
}
std::tuple<Objects*...> m_objs;
};
和一些類A
,B
,C
,...定義如下:
class A { public: A(bool) {} };
class B { /*trivial default ctor*/ };
class C { public: C(int) {} };
如果我創建一個Container<A,B,C>
對象是這樣的:
Container<A,B,C> cnt(new A(true), new C(1));
假設模板參數指定的所有課程都不同,Container<>
模板的構造函數按預期工作,即:
- 的
m_objs
元組的所有指針是否第一套nullptr
,然後 - 1日(
A*
)和第三個(C*
)指針m_objs
分別設置爲由new A(true)
和new C(1)
返回的值。
現在,我想Container<>
構造函數默認構造每個未初始化的指針m_objs
。但我不知道如何實現這一點。
我嘗試添加下面的模板成員函數Container<>
:
template<class Obj, class O1, class ...On>
void objs_ctor()
{
objs_ctor<Obj>();
objs_ctor<O1, On...>();
}
template<class Obj>
void objs_ctor()
{
Obj*& obj = std::get<Obj*>(m_objs);
if (obj == nullptr)
obj = new Obj;
}
和Container<>
構造函數objs_ctor<>
呼叫:
// default-construct unitialized pointers of `m_objs`
objs_ctor<Objects...>();
然而,這顯然是行不通的,因爲我的方式來實現objs_ctor<>
要求默認構造函數存在每個參數包的類(我不想);所以我得到以下編譯器錯誤:
error C2512: 'A' : no appropriate default constructor available
爲了這個工作,我也需要檢查,如果我嘗試自動創建該對象是默認構造的。我認爲這可以使用std::is_default_constructible<>
來實現,但我不知道如何正確使用它。
感謝您的幫助。
你應該好了。編輯的問題。 – shrike