Индекс типа С++ при расширении вариационного шаблона

У меня есть простая, но сложная проблема, которую я не могу решить сам. У меня есть что-то вроде

template<class T, class... Args>
T* create(SomeCastableType* args, size_t numArgs)
{
  return new T(static_cast<Args>(args[INDEX_OF_EXPANSION])...);
}

Предположим, что SomeCastableType применяется для любого типа. Очевидно, что я не могу получить, что INDEX_OF_EXPANSION.

Большое спасибо за вашу помощь.

Ответы

Ответ 1

Индекс трюк, yay ~

template<class T, class... Args, std::size_t... Is>
T* create(U* p, indices<Is...>){
  return new T(static_cast<Args>(p[Is])...);
}

template<class T, class... Args>
T* create(U* p, std::size_t num_args){
  assert(num_args == sizeof...(Args));
  return create<T, Args...>(p, build_indices<sizeof...(Args)>{});
}

Конечно, я настоятельно рекомендую использовать умный указатель и std::vector вместо необработанных указателей.

Ответ 2

Вам нужен помощник:

#include <tuple>

template <typename T, bool, typename Tuple, unsigned int ...I>
struct helper
{
    static T * go(S * args)
    {
        return helper<T, sizeof...(I) + 1 == std::tuple_size<Tuple>::value,
                      Tuple, I..., sizeof...(I)>::go(args);
    }
};

template <typename T, typename ...Args, unsigned int ...I>
struct helper<T, true, std::tuple<Args...>, I...>
{
    static T * go(S * args)
    {
        return new T(static_cast<Args>(args[I])...);
    }
};

template <typename T, typename ...Args>
T * create(S * args)
{
    return helper<T, sizeof...(Args) == 0, std::tuple<Args...>>::go(args);
}

Изменить: проверено, похоже, работает.