2016-07-07 101 views
3

因此,讓我們假設我有下面的類類具有的std ::對象的數組,但沒有默認構造函數

class NoDefaultConstructor { 
    NoDefaultConstructor() = delete; 
    ... 
}; 

而且我有一個具有NoDefaultConstructor類型的數組和其他成員的其他類

class Wrapper { 
    std::array<NoDefaultConstructor, 2> arr; 
    ... 
}; 

如何初始化構造函數中的數組Wrapper(可能在初始化程序列表中使用std::intializer_list)?

更具體地說,是我可以將參數傳遞給初始化程序列表中的數組構造函數的唯一方法,使Wrapper具有類似於以下的構造?我正在考慮這樣做,因爲陣列的大小可能會在未來發生變化。

template <typename... Values> 
Wrapper(Values&&... values) : arr{std::forward<Values>(values)...} {} 
+0

你可以存儲'的std ::的unique_ptr '數組,而不是隻'NoDefaultConstructor'的實例。 – ArchbishopOfBanterbury

+0

我探討了這個想法,但我不想使用它,因爲我寧願在這種情況下使用'std :: vector' – Curious

+0

搜索有關如何在不使用默認構造函數的情況下初始化數據成員的問題。 SO上有很多。 – juanchopanza

回答

6

std::array需要是一個聚合。因此它沒有不平凡的構造函數,但可以使用聚合初始化進行初始化。請注意,聚合初始化涉及到一個括號初始化列表(即,大括號包含的初始化程序列表),但不包含std::initializer_list對象。

class Wrapper { 
    public: 
    Wrapper() : arr {MakeNoDefaultConstructor(123), 
        MakeNoDefaultConstructor(456)} {} 
    //    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ braced-init-list 
    private: 
    std::array<NoDefaultConstructor, 2> arr; 
}; 

編輯與可變參數構造函數可能是可能在這裏,像這樣

#include <array> 
struct NoDefault { 
    NoDefault() = delete; 
    NoDefault(int) {} 
}; 
struct Wrapper { 
    template <typename... Args> 
    Wrapper(int b_in, Args&&... args) : b{b_in}, a{args...} {} 
    int b; 
    std::array<NoDefault, 3> a; 
}; 
int main() { 
    std::array<NoDefault, 2> a {12, 34}; 
    Wrapper w {23, 12, 34, 19}; 
} 

這當然可以進一步嚴格限制加入enable_if小號

+0

有沒有辦法將一些參數轉發給此構造函數?是使用可變參數模板的唯一方法嗎? – Curious

+0

@Curious我不明白,你能否詳細說明一下? – Brian

+0

我希望類構造函數接受參數,然後將其轉發給數組構造函數 – Curious

2

如何我可以初始化Wrapper的構造函數中的數組(也許在初始化程序列表中使用std :: intializer_list)?

正如你對任何其他成員,但使用統一初始化,因爲std::array沒有任何構造函數。

更具體地說,是我可以將參數傳遞給初始化程序列表中的數組構造函數以使包裝具有類似於以下結構的唯一方法?

不,您爲什麼需要爲固定數量的參數使用可變參數模板?

只是......寫的構造,與參數:

class Wrapper { 
    std::array<NoDefaultConstructor, 2> arr; 

    Wrapper(const NoDefaultConstructor& a, const NoDefaultConstructor& b) 
    : arr{ a, b } 
    { } 
}; 
+0

編輯我的問題,爲什麼我想使用可變參數,它現在更有意義嗎? – Curious

相關問題