#include <stdio.h> #include <utility> typedef void (*FuncPtr)(const char* arg1, const char* arg2); void Func(const char* arg1, const char* arg2, size_t arg3) { printf("%s %s %ld\n", arg1, arg2, arg3); } template <size_t Arg3> struct BindFunc { static void Value(const char* arg1, const char* arg2) { Func(arg1, arg2, Arg3); } }; template <typename T, size_t Count, template <size_t> class Generator, typename I> struct static_array_impl; template <typename T, size_t Count, template <size_t> class Generator, size_t... I> struct static_array_impl<T, Count, Generator, std::index_sequence<I...>> { static const T data[Count]; }; template <typename T, size_t Count, template <size_t> class Generator, size_t... I> const T static_array_impl<T, Count, Generator, std::index_sequence<I...>>::data[Count] = { Generator<I>::Value... }; template <typename T, size_t Count, template <size_t> class Generator> struct static_array : static_array_impl<T, Count, Generator, std::make_index_sequence<Count>> { }; static_array<FuncPtr, 10, BindFunc> table; int main(int argc, const char* argv[]) { for (const FuncPtr& func : table.data) { func("generated", "function"); } return 0; }