template struct foo1 : foo1 { foo1() { int x = sizeof...(A); } }; template int bar1() { auto s = sizeof...(X); chomp(X) ...; return X+...; } template void call1v(R (*fp)(Args...)); template void call1p(R (*fp)(Args*...)); template void call1r(R (*fp)(Args&&...)); template struct invoke1v : invoke { }; template struct invoke1p : invoke { }; template struct invoke1r : invoke { }; template < typename ... A, int ... B > struct foo2 : foo2 < A ..., ( sizeof ... ( A ) + B ) ... > { foo2() { int x = sizeof ... ( A ); } }; template < int ... X > int bar2() { auto s = sizeof ... ( X ); chomp( X ) ...; return X + ...; } template < class R, typename ... Args > void call2v( R ( *fp )( Args ... ) ); template < class R, typename ... Args > void call2p( R ( *fp )( Args * ... ) ); template < class R, typename ... Args > void call2r( R ( *fp )( Args && ... ) ); template < class R, typename ... Args > struct invoke2v : invoke < R ( * )( Args ... ) > { }; template < class R, typename ... Args > struct invoke2p : invoke < R ( * )( Args * ... ) > { }; template < class R, typename ... Args > struct invoke2r : invoke < R ( * )( Args && ... ) > { };