メンバー変数の配列のサンプルコードを使用して、クラスメンバーコンテナの初期化を実装しようとしています。
//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
を使用するときに役に立たないようです。{...}
誰かが私の間違いを指摘したり、解決策を指摘したりする可能性があります。 ?
これを解決する最も簡単な方法はm_cContainer.Add(&m_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)
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加