Идиома для моделирования параметров числового шаблона во время выполнения?

Предположим, у нас есть

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

определена. Теперь я хочу реализовать

do_foo(unsigned n);

который вызывает соответствующий вариантfoo(), Это не просто синтетический пример - это действительно происходит в реальной жизни (конечно, не обязательно с функциями void-to-void и только одним параметром шаблона, но я упрощаю. Конечно, в C ++ мы не можем иметь следующее:

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

и что я делаю сейчас

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;
    }
}

когда я знаю, что n эффективно ограничен в диапазоне до n_1, ..., n_k. Но это неправдоподобно, и тем более, когда вызов длиннее, и мне нужно дублировать длинную последовательность шаблонов и обычных параметров много раз.

Я собирался начать работу над макросом для создания этих операторов switch, когда подумал, может быть, кто-то уже работал над этим в какой-то библиотеке и может поделиться тем, что он сделал. Если нет, возможно, все еще выполнимо иметь какую-то конструкцию C ++, которая принимает произвольную функцию, с любой последовательностью параметров шаблона и не шаблонов, включая некоторый числовой параметр шаблона и последовательность значений в некоторой форме, для создания оболочки, которая вместо этого может принять этот параметр шаблона в качестве дополнительного параметра времени выполнения, например

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

Ответы на вопрос(2)

Ваш ответ на вопрос