Индекс типа С++ при расширении вариационного шаблона
У меня есть простая, но сложная проблема, которую я не могу решить сам. У меня есть что-то вроде
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);
}
Изменить: проверено, похоже, работает.