← index
cplusplus17.Examples/features/compile_time/arr_sqrt.cpp
Source: cplusplus17.Examples/features/compile_time/arr_sqrt.cpp
/*
 
 Modified example from "C++ Templates the Complete Guide: Second Edition
 														pg. 530
 
*/


#include<iostream>
#include<string>
#include<cstdlib>
#include<array>

constexpr std::size_t SQRT_VALUE=10;

template<typename T>
constexpr T my_sqrt(T x) {
    if(x <= 1)
        return x;
    
    T lo = 0, hi = x;
    while(1) {
        auto mid = (hi+lo)/2, midSquared= mid*mid;
        if(lo+1 >= hi || midSquared == x) {
            return mid;
        }
        if(midSquared < x) {
            lo = mid;
        } else {
            hi = mid;
        }
    }
}

int main() {
    constexpr auto sqrt_val = my_sqrt(SQRT_VALUE);
    // size of array is determined by calculating the square root of 10
    // at compile time
    std::array<int, sqrt_val> arr;
    for(unsigned int i = 0; i < sqrt_val; ++i) {
        arr[i] = 1;
    }
    std::cout << "Sqrt Value: " << sqrt_val << "\n";
    return 0;
}