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.

questionAnswers(2)

yourAnswerToTheQuestion