#include <iostream>
#include <functional>
#include <vector>

template<typename Arg>
auto func(Arg arg)
-> decltype(arg(), void())
{  
    arg();
}

template<typename Container>
auto func(Container& c)
-> decltype(c.rbegin() != c.rend(), (*c.rbegin())(), void())
{
    for (auto it = c.rbegin(); it != c.rend(); ++it) 
    { 
        (*it)();
    } 
}

template <typename ...Ts>
void funcs(Ts&&... args) 
{
    const int dummy[] = {(func(std::forward<Ts>(args)), 0)..., 0};
    static_cast<void>(dummy); // Avoid warning for unused variable

    // Or in C++17:
    // (func(std::forward<Ts>(args)), ...);
}

void f()
{
    std::cout << "+" ;
}

int main()
{
    funcs(f,f,f); // #1

    std::cout << std::endl;

    std::vector<std::function<void()> > v{f,f};
    funcs(v, f, v); // #2
}
