Szablon C ++ do rozwijania pętli za pomocą przełącznika?
Moje pytanie jest podobne doCzy można rozwinąć pętlę podczas pracy z parametrem liczby całkowitej? ale chcę miksować czas kompilacji i środowisko wykonawcze. W szczególności wiem, że w czasie kompilacji jest stałaNBLOCK
i chcę napisać przełącznik na zmiennejstart_block
która jest znana tylko w czasie wykonywaniaNBLOCK
to liczba wpisów w przełączniku. Oto, co otrzymałem za pomocą makr:
#define CASE_UNROLL(i_loop) \
case i_loop : \
dst.blocks[i_loop+1] -= (load_unaligned_epi8(srcblock) != zero) & block1; \
srcblock += sizeof(*srcblock);
switch(start_block)
{
CASE_UNROLL(0);
#if NBLOCKS > 2
CASE_UNROLL(1);
#endif
#if NBLOCKS > 3
CASE_UNROLL(2);
#endif
#if NBLOCKS > 4
CASE_UNROLL(3);
#endif
...
...
#if NBLOCKS > 15
CASE_UNROLL(14);
#endif
#if NBLOCKS > 16
#error "Too many blocks"
#endif
}
Uważam to za bardzo brzydkie. Zwłaszcza jeśli chcę podnieść granicę z 16 na 32.
Chciałbym wiedzieć, czy jest możliwe napisanie tego za pomocą jakiegoś meta programowania szablonu. Najtrudniejsze jest to, że ze względu na wydajność ważne jest, aby przełącznik był kompilowany z tabelą skoku niż sekwencją zagnieżdżonego warunkowego.
Zauważ, że pytanie jest bardzo podobne doC ++ / C ++ 11 - Przełącz instrukcję na szablony zmienne? ale o ile rozumiem, proponowane tutaj rozwiązanie polega na usunięciu przełącznika za pomocą tablicy wskaźników funkcji inicjalizowanych mieszanym czasem / kompilacją. Nie mogę zapłacić księciu wywołując tutaj funkcję.
Pracuję z GCC, jeśli potrzebne są jakieś paskudne rozszerzenia.