Мне нужно проверить какое-то целое число в момент компиляции (поставить логическое значение в качестве аргумента шаблона).
Я пишу код, который делает это хорошо:
#include <type_traits>
namespace impl {
template <int n, long long i>
struct PrimeChecker {
typedef typename std::conditional<
(i * i > n),
std::true_type,
typename std::conditional<
n % i == 0,
std::false_type,
typename PrimeChecker<n, (i * i > n ) ? -1 : i + 1>::type
>::type
>::type type;
};
template <int n>
struct PrimeChecker<n, -1> {
typedef void type;
};
} // namespace impl
template<int n>
struct IsPrime {
typedef typename impl::PrimeChecker<n, 2>::type type;
};
template<>
struct IsPrime<1> : public std::false_type {
};
Он работает для чисел до ~ 1000000 и не работает с ошибкой для 10 9
prog.cpp:15:23: error: template instantiation depth exceeds maximum of 900 (use -ftemplate-depth= to increase the maximum) instantiating ‘struct impl::PrimeChecker<1000000000, 901ll>’
>::type type;
^
prog.cpp:15:23: recursively required from ‘struct impl::PrimeChecker<1000000000, 3ll>’
prog.cpp:15:23: required from ‘struct impl::PrimeChecker<1000000000, 2ll>’
prog.cpp:24:54: required from ‘struct IsPrime<1000000000>’
prog.cpp:32:41: required from here
Я не могу увеличить границу глубины. Как можно уменьшить глубину, которую я использую?
Вещь, которую я хочу достичь. Мне нужно проверить, является ли константа простой во время компиляции без изменения строки компиляции с ограничением глубины шаблона 900 и constexpr
пределом глубины 512. (по умолчанию для моего g++). Он должен работать для всех положительных int32 или, по крайней мере, для чисел до 10 9 +9