Ну, во-первых, если это похоже на find, вы ограничены IO, так что вы можете просто использовать флаги.Не нужно увлекаться.
Но теперь давайте предположим, что вы на самом деле ограничены вычислениями, и тестирование флагов является значительным:
Просто напишите шаблон-функцию, выполняющую все в зависимости от того, установлен ли флаг варгумент шаблона устанавливается, а затем сопоставляется с флагами в переменной с флагами в аргументе шаблона, например:
class Task {
... Whatever
public:
template <std::size_t N>
void operator()(std::integral_constant<std::size_t, N>) {
if (N & 1) test_0();
if (N & 2) test_1();
if (N & 4) test_2();
...
}
}
my_mux<1<<6>(n, the_task);
Конечно, вам также нужно my_mux()
:
#include <type_traits>
#include <stdexcept>
namespace detail {
template <std::size_t N, class F>
typename std::enable_if<!N>::type my_mux_helper(std::size_t n, F& f) {
n == 0 ? f(std::integral_constant<std::size_t, N>()) : throw std::invalid_argument("n must be smaller than N");
}
template <std::size_t N, class F>
typename std::enable_if<N>::type my_mux_helper(std::size_t n, F& f) {
n == N ? f(std::integral_constant<std::size_t, N>()) : my_mux_helper<N - 1>(n, f);
}
}
template <std::size_t N, class F>
void my_mux(std::size_t n, F f) {
detail::my_mux_helper<N - 1>(n, f);
}
Посмотреть онлайн на coliru .