Angenommen, wir haben Funktion wieCode-Duplizierung Vermeidung für Runtime-to-Compiler-numerischen Parameter Übersetzung
template <typename T, unsigned N> void foo();
und der Einfachheit halber davon aus, dass wir wissen nur, dass (konstant) Werte N_1
, N_2
... N_k
gelten für N
.
Nun, ich nehme an, dass ein Compiler-Parameter eine Laufzeit machen wollen, mit foo()
als Black-Box, das heißt implementieren:
template <typename T> void foo(unsigned n);
von foo<,>()
Anrufe. Wie soll ich das machen? Offensichtlich kann ich schreiben:
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;
}
}
... aber das macht mich alles schmutzig fühlen. Ich könnte ein MAP() -Meta-Makro verwenden, um diese k Zeilen zu erzeugen, nehme ich an; Aber kann ich etwas Besseres und weniger Makronesisches tun, um dasselbe zu erreichen? Ist es möglich, etwas wie das oben genannte zu schreiben, das general ist, und funktioniert für jede variable Vorlage und eine feste Folge von konstanten Werten?
Hinweise:
- C++ 11/14/17-spezifische Vorschläge sind natürlich willkommen.
- Die N's sind nicht notwendigerweise zusammenhängend, noch klein, noch sortiert. z.B. nehme N_2 = 123456789 und N_5 = 1.
@einpoklum Oh sind die ' N_k's nicht zusammenhängend? – Barry
Nein, ich habe nie angedeutet, dass sie es waren. – einpoklum
Eigentlich sollte Ihr Indexer wahrscheinlich schneller als eine ungeordnete Karte sein, wenn k groß ist (vorausgesetzt, der Compiler ist schlau genug). +1. – einpoklum