Первая точка: как указано LF, вы устанавливаете размер tuple
, выделенный в GetPropTuples()
, как число FirstPropType
в props
. Что если число элементов следующих типов больше?
auto firstPropVector = GetProps<FirstPropType>();
tuples = new std::vector<std::tuple<std::shared_ptr<FirstPropType>, std::shared_ptr<NextPropTypes>... >>(firstPropVector.size());
Учитывая, что я оставляю эту проблему нерешенной, я предлагаю вам избежать рекурсии и, учитывая, что вы пометили C ++ 17, использование сворачивания.
Другое предложение: используйте auto
, когда это возможно.
Таким образом, с учетом вспомогательной функции, которая устанавливает значения, с учетом типа и соответствующего индекса
template <std::size_t I, typename PType, typename VType>
static void SetTuples (VType * pv)
{
std::size_t ind{};
for ( auto prop : GetProps<PType>() )
std::get<I>( (*pv)[ind++] ) = prop;
}
вам, по существу, нужна только индексная последовательность, поэтому
template <typename ... PTypes, std::size_t ... Is>
static auto GetPropTuples (std::index_sequence<Is...>)
{
using RetType
= std::vector<std::tuple<std::shared_ptr<PTypes>...>>;
auto tuples = new RetType(1u); // <<--- set the correct size!!!
(SetTuples<Is, PTypes>(tuples), ...);
return tuples;
}
template <typename ... PTypes>
static auto GetPropTuples ()
{ return GetPropTuples<PTypes...>
(std::index_sequence_for<PTypes...>{}); }