Qual è il modo migliore di implementare l'inserimento basato su indice e la cancellazione di un tipo in un elenco di tipi di template variadic (parameter pack)?Inserimento/rimozione del tipo nell'elenco dei modelli variadici (pacchetto parametri)
desiderata codice/comportamento:
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>
>());
ho provato un'applicazione basata sulle spingendo indietro gli argomenti in una lista inizialmente vuota, ma era molto difficile da leggere/mantenere. I parametri erano simili a questo:
template<typename T, int I, int ITarget, typename TResult> struct InsertImpl;
ho costantemente incrementare I
fino a quando non è uguale a ITarget
, spingendo indietro tipi esistenti in TResult
, che è un List<...>
. Quando I
è uguale a ITarget
, spingo indietro T
in TResult
pure.
La rimozione di un tipo ha avuto un'implementazione simile - invece di respingere due volte quando gli indici erano uguali, ho semplicemente saltato il tipo.
La mia soluzione macchinosa implementerebbe l'inserimento e la rimozione in termini di spinta e scoppiettio. Credo che sarebbe più elegante spingere in avanti uguale a Insert<0>
e spingere sul retro uguale a Insert<size>
. Lo stesso vale per lo schiocco dalla parte anteriore e dalla parte posteriore.
C'è un modo migliore per farlo? Potrebbero essere utili le funzionalità di C++ 14?
Come utilizzare l'utilizzo di 'boost :: mpl :: vector' per aiutare con queste operazioni? – Pradhan