So I was learning template meta programming and came across a declaration like this.
template<class> struct S;
template<class R, class...A> struct S<R(A...)>;
So I was wondering what are the different ways to specify the typenames in angular brackets after identifier. So I tried different combinations of declaring a structure. I tried googling but that didn't solve this issue as I didn't know what to google exactly. Or if there's a resource(blog, SO Answer) for this, please point me to it.
template<class> struct S;
// template<class A> struct S<A>; // 1. does not work
// template<class A, class B> struct S<A, B>; // 2. does not work
template<class A, class B> struct S<A(B)>;
template<class A, class ... B> struct S<A(B...)>;
template<class A, class ... B, class C> struct S<A(B..., C)>;
template<class A, class B, class ... C> struct S<A(B, C...)>;
template<class A, class ... B, class ... C> struct S<A(B..., C...)>;
template<class A, class ... B, class ... C, class D> struct S<A(B..., D, C...)>;
// template<class A, class ... B> struct S<B..., A>; // 3. does not work
// template<class A, class ... B> struct S<A, B...>; // 4. does not work
template<class A, class B, class C, class D> struct S<A(B(C(D)))>;
template<class A, class B, class C, class D> struct S<A(B(C, D))>;
template<class A, class B, class C, class D> struct S<A(B, C(D))>;
template<class A, class B, class C, class D> struct S<A(B(D), C)>;
template<class A, class B, class C, class D> struct S<A(B, C, D)>;
int main() {
return 0;
}