User Tools

Site Tools


c_-_c_templates:primary_template-yields_second_or_third_argument_depending_on_first_argument

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

#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;
}
c_-_c_templates/primary_template-yields_second_or_third_argument_depending_on_first_argument.txt · Last modified: 2020/07/15 10:30 by 127.0.0.1

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki