metaprogramming/typefunctions/select-stuff.cc - The ugly and bulky selection stuff. | Lecture 6 - slide 37 : 40 Program 3 |
// Select stuff - templates that define selection of one out of four types (4ed, page 792). struct Nil {}; // A trivial Nil type // select - declared, but not defined in the general case. Only specializations are defined. template <int I, typename T1 = Nil, typename T2 = Nil, typename T3 = Nil, typename T4 = Nil> struct select; // A using alias Select that binds unused types to Nil template <int I, typename T1 = Nil, typename T2= Nil, typename T3 = Nil, typename T4 = Nil> using Select = typename select<I, T1, T2, T3, T4>::type; // Specializations for 0-3 template <typename T1, typename T2, typename T3, typename T4> struct select<0, T1, T2, T3, T4> {using type = T1;}; // Specialization for 0 template <typename T1, typename T2, typename T3, typename T4> struct select<1, T1, T2, T3, T4> {using type = T2;}; // Specialization for 1 template <typename T1, typename T2, typename T3, typename T4> struct select<2, T1, T2, T3, T4> {using type = T3;}; // Specialization for 2 template <typename T1, typename T2, typename T3, typename T4> struct select<3, T1, T2, T3, T4> {using type = T4;}; // Specialization for 3