    namespace detail
    {
        template<typename... Ts>
        struct do_foo;

        template<typename T, typename... Ts>
        struct do_foo<T, Ts...>
        {
            static void call()
            {
                T::foo();
                do_foo<Ts...>::call();
            }
        };

        template<typename T>
        struct do_foo<T>
        {
            static void call()
            {
                T::foo();
            }
        };
    }

    template<typename... Ts>
    void do_foo()
    {
        detail::do_foo<Ts...>::call();
    }

    #include <iostream>

    struct X { static void foo() { std::cout << "X::foo()" << std::endl; }; };
    struct Y { static void foo() { std::cout << "Y::foo()" << std::endl; }; };
    struct Z { static void foo() { std::cout << "Z::foo()" << std::endl; }; };

    int main()
    {
        do_foo<X, Y, Z>();
    }
