Мне нужно проверить, является ли целое число простым во время компиляции (чтобы поставить логическое значение в качестве аргумента шаблона).Первичная проверка времени компиляции
Я писать код, что делать это хорошо:
#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
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. (по умолчанию для моего г ++). Он должен работать для всех положительных int32 или, по крайней мере, для чисел до 10 +9
Почему бы не использовать constexpr? Посмотрите здесь: http://cpptruths.blogspot.no/2011/07/want-speed-use-constexpr-meta.html – olevegard
Итак, вас трогают гуру C++ и приходят к SO с помощью. .. _homework _... :) – sehe
@olevegard Я не знаю, но не все компиляторы, претендующие на поддержку C++ 11, имеют 'constexpr'. (Я смотрю на тебя VS2012 ...) – Mysticial