我正在尝试使用成员变量数组示例代码实现类成员容器初始化:
//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})
{}
};
我尝试了多个容器构造函数语法,但似乎都没有帮助,例如我尝试使用CContainer(CMember** apcArray, size_t nSize
并在CProblematic
构造期间传递它,但在使用{{1时似乎没有帮助样式数组创建,也许有人可以指出我的错误或指向解决方案?
我知道解决这个问题的最简单方法就是为每个成员添加构造函数体{...}
,但我更感兴趣的是有一个初始化方法的解决方案......
答案 0 :(得分: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
答案 1 :(得分:1)
在实现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)