Как лучше всего реализовать вставку и удаление типа на основе индекса в списке типов вариативного шаблона (пакет параметров)?
Желаемый код / поведение:
template<typename...> struct List { /* ... */ };
static_assert(is_same
<
List<int, char, float>::Insert<int, 0>,
List<int, int, char, float>
>());
static_assert(is_same
<
List<int, char, float>::Insert<int, 2>,
List<int, char, int, float>
>());
static_assert(is_same
<
List<int, char, float>::Remove<0>,
List<char, float>
>());
static_assert(is_same
<
List<int, char, float>::Remove<1>,
List<int, float>
>());
Я пробовал реализацию, основанную на возвращении аргументов в изначально пустой список, но его было очень трудно читать / поддерживать. Параметры были похожи на эти:
template<typename T, int I, int ITarget, typename TResult> struct InsertImpl;
Я постоянно увеличиваю I
, пока он не станет равным ITarget
, отодвигая существующие типы в TResult
, что является List<...>
. Когда I
равно ITarget
, я также возвращаю T
в TResult
.
Удаление типа имело аналогичную реализацию - вместо того, чтобы дважды возвращаться, когда индексы были равны, я просто пропустил тип.
Мое громоздкое решение будет реализовывать вставку и удаление с точки зрения нажатия и выталкивания. Я считаю, что было бы более элегантно иметь толкание вперед, равное Insert<0>
, и толкание назад, равное Insert<size>
. То же самое относится к появлению спереди и сзади.
Есть ли лучший способ сделать это? Могут ли помочь функции C ++ 14?
boost::mpl::vector
для помощи в этих операциях? - person Pradhan   schedule 10.02.2015