Rozważmy następujący kod w pełni robocze:Indeksy trik stosowany dla kilku składników
#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");
}
Co faktycznie chcę być wyjście jest
Pack<2,-3,0, 3,-6,1, 4,-9,2, 5,-12,3>
zamiast Pack<2,3,4,5, -3,-6,-9,-12, 0,1,2,3>
. Najpierw wypróbowałem
ale jest to po prostu zrozumiałe przez kompilator być bezużytecznym operatorem przecinka. Jaka jest pożądana składnia, aby uzyskać to, czego chcę? Jeśli nie ma takiej składni, jaki jest najczystszy sposób, aby to zrobić, pamiętając, że trzykrotne użycie numeru Indices
jest tylko przykładem (możemy chcieć go użyć więcej niż 3 razy). Proszę nie mówić mi, że muszę napisać pomocnika, aby wyodrębnić poszczególne paczki, a następnie "przeplatać" wszystkie elementy. Ta koszmarna metoda nie może być najlepszym rozwiązaniem (i takie rozwiązanie zadziałałoby tylko wtedy, gdybyśmy dokładnie wiedzieli, ile pojedynczych pakietów do wyodrębnienia).
Czy definiowania
template <typename T, template <T...> class P, T I>
struct Component {
using type = P<I+1, -3*I, I-1>;
};
jakoś pomóc? Dodać do tego rozszerzenie paczki?
Nie jestem pewien, pisząc funkcję do zrobienia czegoś jest tak koszmarny - to jest dokładnie to, co byś zrobił jakbyś próbował zrobić to samo coś w * runtime *. – Hurkyl
@Hurkyl. W rzeczywistości nie jest tak koszmarnie, masz rację. Jednak poniższe rozwiązanie Columbo jest znacznie lepsze. – prestokeys