Listing 10

// Using For<> to calculate the square root

template<int number, int low_ = 0 , int high_ = number>
struct sqrt_state
{
     enum { num = number }; // doesn't change
     enum { low = low_ };
     enum { high = high_ };
};
template<typename state>
struct sqrt_cond
{
      enum { result =  state::low < state::high };
};
template <typename state>
struct sqrt_incr
{
       typedef state result ;      // state is left unchanged
};
// slice the range into two halves and decide in which half 
// to continue search
template<typename state>
struct sqrt_body
{
         enum { mid = state::low + (state::high - state::low) /2 };
         enum { in_first_half =  mid * mid >= state::num } ;
         typedef sqrt_state<state::num, state::low, mid>  first_half;
         typedef sqrt_state<state::num, mid+1, state::high>  sec_half;
         typedef typename If_else< in_first_half, first_half, 
                                            sec_half >::result result;
};
// compute square root of N
template <int N>
struct sqroot
{
   enum { result =  For<sqrt_cond, sqrt_incr, 
                             sqrt_body, sqrt_state<N> >::result::low } ;
};
cout << sqroot<16>::result ;