2016-07-07 100 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

相关问题