Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
template struct while_f {
template <int res, int x>
struct calc_res {
const static int tmp = (res+x/res)/2;
typedef typename while_f<(res > tmp)>::template calc_res<tmp<res?tmp:res, x> a;
static const int value = a::value;
};
};
template <> struct while_f {
template <int res, int x>
struct calc_res {
static const int value = res;
};
};
template struct sqrt {
static const int value = while_f::calc_res<(x+1)/2, x>::value;
};
template <> struct sqrt<0> {
static const int value = 0;
};
// assert(sqrt<81>::value == 9);
template<unsigned V>
struct Sqrt
{
template<unsigned L, unsigned R>
struct Sqrt_eval
{
static const unsigned M = (L + R + 1) / 2;
static const bool D = M * M < V;
static const bool Stop = L + 1 >= R;
static const unsigned N = R * R > V ? L : R;
static const unsigned value = Sqrt_eval<Stop ? N : D ? M : L, Stop ? N : D ? R : M>::value;
};
template<unsigned M>
struct Sqrt_eval<M, M>
{
static const unsigned value = M;
};
static const unsigned value = Sqrt_eval<0, V>::value;
};
Шаблоны C++ позволяют обрабатывать некоторые значения параметров шаблона особым образом (частичная специализация).
Скобочки и префиксная запись напрягают, когда на Scheme и других диалектах Lisp не пишешь, а только теоретизируешь о них.
Да и назвать шаблонную магию объёмом в несколько раз больше, чем соответствующий код на Scheme, красивой…Ну во-первых красота измеряется не объемом. Во-вторых само понятие красоты очень субъективно, поэтому постом выше я написал «лично мне». А в-третьих, на мой взгляд, тут сравнивать не совсем корректно. Код на Scheme в статье описан в императивном стиле, а на шаблонах — в декларативном(что-то близкое к pattern matching из функциональных языков).
def imperative(x: Int) {
if(x == 1) {
println("one")
} else if(x == 2) {
println("two")
} else {
println("many")
}
}def declarative(x: Int) = x match {
case 1 => println("one")
case 2 => println("two")
case _ => println("many")
}declarative(1) = "one"
declarative(2) = "two"
declarative(_) = "many"
Вычисление простых чисел на шаблонах C++