初始化列表时间成员容器初始化与成员数组

Initializer list time member container initialization with array of members

我正在尝试使用成员变量数组示例代码实现 class 成员容器初始化:

//Pseudo container declaration
class CContainer
{
    template<size_t nSize>
    CContainer(CMember* acArray[nSize]);
};
//class whos members i wanna pass as array to container initialization
class CProblematic
{
    CMember m_1;
    CMember m_2;
    ...
    CMember m_n;
    CContainer m_cContainer;

    //constructor with container initialization
    CProblematic(int parameter)
    : m_1(parameter)
    , m_2(parameter)
    ...
    , m_n(parameter)
    , m_cContainer({&m_1, &m_2, ... , &m_n})
    {}
};

我尝试了多个容器构造函数语法,但 none 似乎有帮助,例如我尝试使用 CContainer(CMember** apcArray, size_t nSize 并在 CProblematic 构造期间传递它,但似乎没有在使用 {...} 样式数组创建时提供帮助,也许有人可以指出我的错误或指出解决方案?

我知道解决这个问题的最简单方法就是简单地为每个成员添加构造函数主体 m_cContainer.Add(&m_1),但我更感兴趣的是是否有一种以这种方式初始化的解决方案...

似乎找到了解决方案,如果有人遇到同样的问题,这是我的解决方案

//problematic constructor 
CProblematic(int parameter)
    : m_1(parameter)
    , m_2(parameter)
    ...
    , m_n(parameter)
    //only drawback, you must specify n by hand
    , m_cContainer(std::array<CMember*, n>{&m_1, &m_2, ... , &m_n})
    {}

//Container constructor
template<size_t nSize>
CContainer(std::array<CMember*, nSize>&& aArray) 
//since we're creating rvalue reference in initialization list

在实现 CWG 1591 分辨率的编译器上,您可以执行

template<size_t nSize>
CContainer(CMember* const (&acArray)[nSize]); // or CMember* (&&acArray)[nSize]

并让 nSize 从 braced-init-list {&m_1, &m_2, ... , &m_n} 推导出来。

否则,要推导边界,您可以将 std::array 与辅助函数模板一起使用。以下是std::experimental::make_array的简化版:

template <class... Ts>
auto make_array(Ts&&... t) -> std::array<std::common_type_t<Ts...>, sizeof...(Ts)>{
    return { std::forward<Ts>(t)... };
}

然后 m_cContainer(make_array(&m_1, &m_2, ... , &m_n)) 构造函数采用 std::array 就像你的答案:

template<size_t nSize>
CContainer(std::array<CMember*, nSize>&& aArray)