80 lines · cpp
1template<typename T, typename P>2struct TwoOptionTemplate {};3 4template<typename T>5struct TwoOptionTemplate<T, char> {6 int member;7};8 9 10template<typename T>11struct TwoOptionTemplate<T, double> {12 float member;13};14 15template<typename T>16struct TwoOptionTemplate<T, T> {17 T** member;18};19 20TwoOptionTemplate<int, char> X0;21TwoOptionTemplate<int, double> X1;22TwoOptionTemplate<void *, wchar_t> X2;23TwoOptionTemplate<long, long> X3;24TwoOptionTemplate<int, int> X4;25TwoOptionTemplate<long, long> SingleDest;26TwoOptionTemplate<int, double> SecondDoubleDest;27 28 29template<int I, class C>30struct IntTemplateSpec {};31 32template<class C>33struct IntTemplateSpec<4, C> {34 C member;35};36 37template<int I>38struct IntTemplateSpec<I, void *> {39 double member;40 static constexpr int val = I;41};42 43template<int I>44struct IntTemplateSpec<I, double> {45 char member;46 static constexpr int val = I;47};48 49IntTemplateSpec<4, wchar_t>Y0;50IntTemplateSpec<5, void *> Y1;51IntTemplateSpec<1, int> Y2;52IntTemplateSpec<2, int> Y3;53IntTemplateSpec<43, double> NumberDest;54 55namespace One {56namespace Two {57namespace Three {58 59template<class T>60class Parent {};61 62} // namespace Three63 64} // namespace Two65 66template<typename T, typename X>67struct Child1: public Two::Three::Parent<unsigned> {68 char member;69};70 71template<class T>72struct Child1<T, One::Two::Three::Parent<T>> {73 T member;74};75 76} // namespace One77 78namespace Dst { One::Child1<double, One::Two::Three::Parent<double>> Z0Dst; }79One::Child1<int, float> Z1;80