Considerate questo codice completamente funzionante:Indici trucco usato per diversi componenti
#include <type_traits>
template <typename T, typename IndexPack> struct Make;
template <typename T, template <T...> class P, T... Indices>
struct Make<T, P<Indices...>> {
using type = P<(Indices+1)..., (-3*Indices)..., (Indices-1)...>;
};
template <int...> class Pack;
int main() {
static_assert (std::is_same<Make<int, Pack<1,2,3,4>>::type,
Pack<2,3,4,5, -3,-6,-9,-12, 0,1,2,3>>::value, "false");
}
Quello che in realtà voglio l'uscita per essere è
Pack<2,-3,0, 3,-6,1, 4,-9,2, 5,-12,3>
invece di Pack<2,3,4,5, -3,-6,-9,-12, 0,1,2,3>
. Ho provato per la prima volta
using type = P<(Indices+1, -3*Indices, Indices-1)...>;
ma questo è semplicemente capito dal compilatore come un operatore virgola inutile. Qual è la sintassi desiderata per ottenere ciò che voglio? Se non esiste una tale sintassi, qual è il modo più pulito per farlo, tenendo presente che l'utilizzo di Indices
3 volte è solo un esempio (potremmo volerlo utilizzare più di 3 volte). Per favore non dirmi che devo scrivere un aiutante per estrarre i singoli pacchetti e quindi "intrecciare" tutti gli elementi. Quel metodo da incubo non può essere la soluzione migliore (e una soluzione del genere funzionerebbe anche solo se sapessimo esattamente quanti singoli pacchetti estrarre).
Sarebbe definire
template <typename T, template <T...> class P, T I>
struct Component {
using type = P<I+1, -3*I, I-1>;
};
aiuto in qualche modo? Fai un'espansione di pacchetto su questo?
Non sono sicuro che scrivere una funzione per fare qualcosa è così da incubo - è esattamente quello che si potrebbe fare se si stava tentando di fare lo stesso sorta di cosa a * runtime *. – Hurkyl
@Hurkyl. In realtà non è così da incubo, hai ragione. Ma la soluzione di Columbo qui sotto è di gran lunga migliore. – prestokeys