Я пытаюсь написать общую реализацию static_for
, которая может принимать ограничения, функцию приращения и функцию сравнения для запуска цикла. Я использую эту конструкцию с простыми циклами, которые увеличиваются на 1. В этом случае легко остановить разворот цикла, просто специализировавшись на IDX & END
, равном.
Однако, когда инкремент может быть с любым целым числом, не гарантируется, что IDX & END
всегда будет равным. Условие if
оценивается только во время выполнения. В нижеприведенном фрагменте кода я пытался специализироваться на std::false_type
, который останавливает рекурсию. Интеграл_констант строится путем оценки функциональности std::less
(который может быть заменен пользователем для любой другой оценки). К сожалению, этот функционал comparator
также оценивается только во время выполнения и, следовательно, компилятор не работает. Может ли кто-нибудь посоветовать, как это сделать?
ПРИМЕЧАНИЕ: использование С++ 11.
template <int idx, int end, typename eval, int count, typename comparator>
struct static_for_loop {
template <typename Lambda, typename... Args>
void operator()(const Lambda& function, Args... args) const {
if (comparator()(idx, end)) {
std::integral_constant<int, idx> i;
function(i, args...);
constexpr bool lesser = comparator()(idx + count, end);
static_for_loop<idx + count, end, std::integral_constant<bool, lesser>, count,
comparator>()(function, args...);
}
}
};
template <int idx, int end, int count, typename comparator>
struct static_for_loop<idx, end, std::false_type, count, comparator> {
template <typename Lambda, typename... Args>
void operator()(const Lambda& function, Args... args) const {}
};
template <int idx, int end, int count = 1, typename comparator = std::less<int>>
struct static_for {
template <typename Lambda, typename... Args>
void operator()(const Lambda& function, Args... args) const {
static_for_loop<idx, end, std::true_type, count, comparator>()(function, args...);
}
};