как написать код короче на С++11 с помощью variadic template
кто знает,подскажите плиз как переписать вот такой код через пакеты расширений variadic template(template<class...Ts> struct MakeTypelist{};?
template <int POSITION,class TPin>
struct PW {
typedef TPin Pin;
enum {position = POSITION};
};
//---------------------------------------------------
template
<
int Position, // стартовая битовая позиция, сначала это 0
typename T1 = NullType, typename T2 = NullType, typename T3 = NullType,
typename T4 = NullType, typename T5 = NullType, typename T6 = NullType,
typename T7 = NullType, typename T8 = NullType, typename T9 = NullType,
typename T10 = NullType, typename T11 = NullType, typename T12 = NullType,
typename T13 = NullType, typename T14 = NullType, typename T15 = NullType,
typename T16 = NullType, typename T17 = NullType
>
struct MakePinList
{
private:
// рекурсивно проходим все параметры
// на следующей итерации Position увеличится на 1,
// а T2 превратится в T1 и так далее
typedef typename MakePinList
<
Position + 1,
T2, T3, T4,
T5, T6, T7,
T8, T9, T10,
T11, T12, T13,
T14, T15, T16,
T17
>::Result TailResult;
enum { PositionInList = Position };
public:
// Result это и есть требуемый список линий
typedef Typelist< PW<T1, PositionInList>, TailResult> Result;
};
//конец списка
//конец рекурсии, когда список пуст
template<int Position>
struct MakePinList<Position>
{
typedef NullType Result;
};
Ответы (2 шт):
Непонятно, вам нужен именно С++11, или "С++11 или новее". На C++14 выглядит так:
template <typename ...P>
struct TypeList {};
template <int I, typename T>
struct PW
{
using Pin = T;
static constexpr int position = I;
};
namespace detail
{
template <typename I, typename ...P>
struct MakePinList {};
template <int ...I, typename ...P>
struct MakePinList<std::integer_sequence<int, I...>, P...>
{
using type = TypeList<PW<I, P>...>;
};
}
template <typename ...P>
using PinList = typename detail::MakePinList<std::make_integer_sequence<int, sizeof...(P)>, P...>::type;
PinList<int, float, double> -> TypeList<PW<0, int>, PW<1, float>, PW<2, double>.
вот моя реализация integer_sequence :
template <int... Ns>
struct sequence {};
template <int... Ns>
struct seq_gen;
template <int I, int... Ns>
struct seq_gen<I, Ns...> {
using type = typename seq_gen<I - 1, I - 1, Ns...>::type;
};
template <int... Ns>
struct seq_gen<0, Ns...> {
using type = sequence<Ns...>;
};
template <int N>
using sequence_t = typename seq_gen<N>::type;
//======================================================================
template <typename ...P>
struct TypeList {};
template <int I, typename T>
struct PW
{
using Pin = T;
static constexpr int position = I;
};
namespace detail
{
template <typename I, typename ...P>
struct MakePinList {};
template <int ...I, typename ...P>
struct MakePinList<sequence_t< I...>, P...>
{
using type = TypeList<PW<I, P>...>;
};
}
template <typename ...P>
using PinList = typename detail::MakePinList<sequence_t< sizeof...(P)>, P...>::type;
но чего-то не хватает, компилятор пишет:
Серьезность Код Описание Проект Файл Строка Состояние подавления
Ошибка C2210 "N": расширения пакетов невозможно использовать в качестве аргументов для неупакованных параметров в шаблонах псевдонимов MakePinList F:\QTproj\MakePinList\MakePinList.cpp 43
Серьезность Код Описание Проект Файл Строка Состояние подавления
Ошибка (активно) E0842 constant "I" не используется или не может быть выведено из списка аргументов шаблона шаблон класса "detail::MakePinList<sequence_t<I...>, P...>" MakePinList F:\QTproj\MakePinList\MakePinList.cpp 42
Серьезность Код Описание Проект Файл Строка Состояние подавления
Ошибка C3855 detail::MakePinList: параметр шаблон "I" несовместим с объявлением MakePinList F:\QTproj\MakePinList\MakePinList.cpp 46