#include <iostream>
#include <vector>

typedef void (*func_type)();

void func1() { std::cout << "func1\n"; }
void func2() { std::cout << "func2\n"; }
void func3() { std::cout << "func3\n"; }
void func4() { std::cout << "func4\n"; }
void func5() { std::cout << "func5\n"; }


template <typename iter_type>
void execute(iter_type beg, const iter_type& end)
{
    while (beg != end)
        (*beg++)();
}

void with_new_and_array()
{
    func_type* funcs = new func_type[5];
    funcs[0] = func1;
    funcs[1] = func2;
    funcs[2] = func3; 
    funcs[3] = func4;
    funcs[4] = func5;

    execute(funcs, funcs + 5);
    delete [] funcs;
}

void with_vector()
{
    std::vector<func_type> funcs = { func1, func2, func3, func4, func5 };
    execute(funcs.begin(), funcs.end());
}


int main()
{
    with_new_and_array();
    with_vector();
}
