Introducing Radical.sh

Forget Code launches a powerful code generator for building API's

Primary Template-Yields Second or Third Argument Depending on First Argument in C++

#include <iostream>


// primary template: yield second or third argument depending on first argument
template<bool C, typename Ta, typename Tb>
class IfThenElse;

// partial specialization: true yields second argument
template<typename Ta, typename Tb>
class IfThenElse<true, Ta, Tb> {
  public:
    typedef Ta ResultT;
};

// partial specialization: false yields third argument
template<typename Ta, typename Tb>
class IfThenElse<false, Ta, Tb> {
  public:
    typedef Tb ResultT;
};



// template to yield template argument as result
template<int N>
class Value {
  public:
    enum { result = N };
};

// template to compute sqrt(N) via iteration
template <int N, int I=1>
class Sqrt {
  public:
    // instantiate next step or result type as branch
    typedef typename IfThenElse<(I*I<N),
                                Sqrt<N,I+1>,
                                Value<I>
                               >::ResultT
            SubT;

    // use the result of branch type
    enum { result = SubT::result };
};

int main()
{
    std::cout << "Sqrt<16>::result = " << Sqrt<16>::result << std::endl;
    std::cout << "Sqrt<25>::result = " << Sqrt<25>::result << std::endl;
    std::cout << "Sqrt<42>::result = " << Sqrt<42>::result << std::endl;
    std::cout << "Sqrt<1>::result =  " << Sqrt<1>::result << std::endl;
}