Variadic Templates pack expansions

Dentro Palestra de Andrei no GoingNative 2012 ele fala sobre modelos variados e explica em um momento o exemplo abaixo de como as expansões do pacote de parâmetros funcionam. Sendo relativamente novo nesse assunto, achei bastante difícil acompanhar como cada caso funciona. Alguém poderia explicar como a expansão funciona em cada chamada de função degun?

template<class... Ts> void fun(Ts... vs) {
    gun(A<Ts...>::hun(vs)...);
    gun(A<Ts...>::hun(vs...));
    gun(A<Ts>::hun(vs)...);
}