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