инициализация std::tuple, какие конструкторы элементов требуют объекта из другого std::tuple

рассмотрим следующий код

template<typename T> struct B;
template<typename T> struct C;

template<typename...As>
struct A
{
   typedef std::tuple< B<As> ...> Bs;
   typedef std::tuple< C< B<As> >...> Cs;

   Bs m_Bs; 
   Cs m_Cs;

    A() :  
    m_Bs(B<As(someargs)...),
    m_Cs(????...)
   {}

};

Как мне инициализировать m_Cs, если мне нужно инициализировать std::get<n>(m_Cs) с помощью std::get<n>(m_Bs), т.е. конструктор каждого элемента в m_Cs требует соответствующего элемента из m_Bs


person Michael Medvinsky    schedule 10.08.2018    source источник


Ответы (1)


Как мне инициализировать m_Cs, если мне нужно инициализировать std::get<n>(m_Cs) с помощью std::get<n>(m_Bs), т.е. конструктор каждого элемента в m_Cs требует соответствующего элемента из m_Bs

Я полагаю, вы можете использовать конструктор делегирования с помощью std::index_sequence/std::index_sequence_for

Что-то вроде следующего

  template <std::size_t ... Is>
  A (std::index_sequence<Is...> const &, As const & ... args)
     : m_Bs{B<As>{args}...}, m_Cs{std::get<Is>(m_Bs)...}
   { }

  A (As const & ... args)
     : A{std::index_sequence_for<As...>{}, args...}
   { }

Ниже приведен полный пример компиляции

#include <tuple>
#include <type_traits>

template <typename T>
struct B
 { B (T const &) {} };

template <typename T>
struct C
 { C (T const &) {} };

template <typename ... As>
struct A
 {
   private: 
      using Bs = std::tuple<B<As>...>;
      using Cs = std::tuple<C<B<As>>...>;

      Bs m_Bs; 
      Cs m_Cs;

      template <std::size_t ... Is>
      A (std::index_sequence<Is...> const &, As const & ... args)
         : m_Bs{B<As>{args}...}, m_Cs{std::get<Is>(m_Bs)...}
       { }

   public:
      A (As const & ... args)
         : A{std::index_sequence_for<As...>{}, args...}
       { }
 };

int main()
 {
   A<int, long, long long> a{1, 2L, 3LL};
 }
person max66    schedule 11.08.2018