1*99451b44SJordan Rupprecht #include <tuple> 2*99451b44SJordan Rupprecht 3*99451b44SJordan Rupprecht template <int Arg> 4*99451b44SJordan Rupprecht class TestObj 5*99451b44SJordan Rupprecht { 6*99451b44SJordan Rupprecht public: getArg()7*99451b44SJordan Rupprecht int getArg() 8*99451b44SJordan Rupprecht { 9*99451b44SJordan Rupprecht return Arg; 10*99451b44SJordan Rupprecht } 11*99451b44SJordan Rupprecht }; 12*99451b44SJordan Rupprecht 13*99451b44SJordan Rupprecht //---------------------------------------------------------------------- 14*99451b44SJordan Rupprecht // Define a template class that we can specialize with an enumeration 15*99451b44SJordan Rupprecht //---------------------------------------------------------------------- 16*99451b44SJordan Rupprecht enum class EnumType 17*99451b44SJordan Rupprecht { 18*99451b44SJordan Rupprecht Member, 19*99451b44SJordan Rupprecht Subclass 20*99451b44SJordan Rupprecht }; 21*99451b44SJordan Rupprecht 22*99451b44SJordan Rupprecht template <EnumType Arg> class EnumTemplate; 23*99451b44SJordan Rupprecht 24*99451b44SJordan Rupprecht //---------------------------------------------------------------------- 25*99451b44SJordan Rupprecht // Specialization for use when "Arg" is "EnumType::Member" 26*99451b44SJordan Rupprecht //---------------------------------------------------------------------- 27*99451b44SJordan Rupprecht template <> 28*99451b44SJordan Rupprecht class EnumTemplate<EnumType::Member> 29*99451b44SJordan Rupprecht { 30*99451b44SJordan Rupprecht public: EnumTemplate(int m)31*99451b44SJordan Rupprecht EnumTemplate(int m) : 32*99451b44SJordan Rupprecht m_member(m) 33*99451b44SJordan Rupprecht { 34*99451b44SJordan Rupprecht } 35*99451b44SJordan Rupprecht getMember() const36*99451b44SJordan Rupprecht int getMember() const 37*99451b44SJordan Rupprecht { 38*99451b44SJordan Rupprecht return m_member; 39*99451b44SJordan Rupprecht } 40*99451b44SJordan Rupprecht 41*99451b44SJordan Rupprecht protected: 42*99451b44SJordan Rupprecht int m_member; 43*99451b44SJordan Rupprecht }; 44*99451b44SJordan Rupprecht 45*99451b44SJordan Rupprecht //---------------------------------------------------------------------- 46*99451b44SJordan Rupprecht // Specialization for use when "Arg" is "EnumType::Subclass" 47*99451b44SJordan Rupprecht //---------------------------------------------------------------------- 48*99451b44SJordan Rupprecht template <> 49*99451b44SJordan Rupprecht class EnumTemplate<EnumType::Subclass> : 50*99451b44SJordan Rupprecht public EnumTemplate<EnumType::Member> 51*99451b44SJordan Rupprecht { 52*99451b44SJordan Rupprecht public: EnumTemplate(int m)53*99451b44SJordan Rupprecht EnumTemplate(int m) : EnumTemplate<EnumType::Member>(m) 54*99451b44SJordan Rupprecht { 55*99451b44SJordan Rupprecht } 56*99451b44SJordan Rupprecht }; 57*99451b44SJordan Rupprecht 58*99451b44SJordan Rupprecht template <typename FLOAT> struct T1 { FLOAT f = 1.5; }; 59*99451b44SJordan Rupprecht template <typename FLOAT> struct T2 { FLOAT f = 2.5; int i = 42; }; 60*99451b44SJordan Rupprecht template <typename FLOAT, template <typename> class ...Args> class C { std::tuple<Args<FLOAT>...> V; }; 61*99451b44SJordan Rupprecht main(int argc,char ** argv)62*99451b44SJordan Rupprechtint main(int argc, char **argv) 63*99451b44SJordan Rupprecht { 64*99451b44SJordan Rupprecht TestObj<1> testpos; 65*99451b44SJordan Rupprecht TestObj<-1> testneg; 66*99451b44SJordan Rupprecht EnumTemplate<EnumType::Member> member(123); 67*99451b44SJordan Rupprecht EnumTemplate<EnumType::Subclass> subclass(123*2); 68*99451b44SJordan Rupprecht C<float, T1> c1; 69*99451b44SJordan Rupprecht C<double, T1, T2> c2; 70*99451b44SJordan Rupprecht return testpos.getArg() - testneg.getArg() + member.getMember()*2 - subclass.getMember(); // Breakpoint 1 71*99451b44SJordan Rupprecht } 72