Idiom zum Simulieren numerischer Laufzeitvorlagenparameter?

ngenommen, wir haben

template <unsigned N> foo() { /* ... */ }

defined Nun möchte ich @ implementier

do_foo(unsigned n);

, das die entsprechende Variante von @ aufrufoo(). Dies ist nicht nur ein synthetisches Beispiel - dies geschieht tatsächlich im wirklichen Leben (natürlich nicht notwendigerweise mit Funktionen von Void zu Void und nur einem Template-Parameter, aber ich vereinfache das. Natürlich können wir das in C ++ nicht habe folgendes:

do_foo(unsigned n) { foo<n>(); }

nd was ich gerade tue ist

do_foo(unsigned n) { 
    switch(n) {    
    case n_1: foo<n_1>(); break;
    case n_2: foo<n_2>(); break;
    /* ... */
    case n_k: foo<n_k>(); break;
    }
}

wenn ich weiß, dass n effektiv auf n_1, ..., n_k begrenzt ist. Aber das ist unpassend, und das umso mehr, wenn der Aufruf länger ist und ich eine lange Folge von Vorlagen- und regulären Parametern mehrmals duplizieren muss.

Ich wollte gerade an einem Makro arbeiten, um diese switch-Anweisungen zu erstellen, als ich dachte, vielleicht hat bereits jemand in einer Bibliothek daran gearbeitet und könnte mitteilen, was sie getan haben. Wenn nicht, ist es vielleicht immer noch möglich, eine Art C ++ - Konstrukt zu haben, das eine beliebige Funktion übernimmt, mit einer beliebigen Folge von Template- und Nicht-Template-Parametern, einschließlich eines numerischen Template-Parameters, und einer Folge von Werten in irgendeiner Form, um einen Wrapper zu erzeugen, der kann diesen Vorlagenparameter stattdessen als zusätzlichen Laufzeitparameter verwenden, z. B.

auto& transformed_foo = magic<decltype(foo)>(foo)::transformed;