Идиома для моделирования параметров числового шаблона во время выполнения?
Предположим, у нас есть
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;