Załóżmy, że mamy takie funkcje jakUnikanie powielania kodu do runtime-do-czasu kompilacji tłumaczenia parametr numeryczny
template <typename T, unsigned N> void foo();
i dla uproszczenia zakładamy, że wiemy, że tylko (stała) wartości N_1
, N_2
... N_k
są ważne dla N
.
Teraz załóżmy, że chcę, aby ten parametr kompilacji czas run-time jeden, używając foo()
jako czarnej skrzynki, to znaczy realizować:
template <typename T> void foo(unsigned n);
dokonując foo<,>()
połączeń. Jak mam to zrobić? Oczywiście, mogę napisać:
template <typename T> void foo(unsigned n) {
switch(n) {
case N_1 : foo<T, N_1>(); break;
case N_2 : foo<T, N_2>(); break;
// etc. etc.
case N_k : foo<T, N_k>(); break;
}
}
... ale to sprawia, że czuję się bardzo brudny. Mógłbym użyć meta-makro MAP() do wygenerowania tych k linii, jak przypuszczam; ale czy mogę zrobić cokolwiek lepiej i mniej makro, aby osiągnąć to samo? Czy można napisać coś podobnego do powyższego: ogólne i działa dla każdego szablonu variadic i ustalonej sekwencji wartości stałych?
Uwagi:
- C++ 11/14/17-konkretne sugestie są oczywiście mile widziane.
- N's niekoniecznie są ciągłe, ani małe, ani posortowane. na przykład Przypuszczam N_2 = 123456789 i N_5 = 1.
@einpoklum Oh są ' N_k's nie sąsiadują? – Barry
Nie, nigdy nie sugerowałem, że są. – einpoklum
W rzeczywistości indeksator powinien być prawdopodobnie szybszy niż mapa nieuporządkowana, chyba że k jest duże (zakładając, że kompilator jest wystarczająco inteligentny). +1. – einpoklum