Make constexpr array of function values
One simple improvement: the return type of make_array_of_2d_func_values() can be auto, to save writing std::array&lt;std::invoke_result_t&lt;Func, std::size_t, std::size_t&gt;, rows * cols&gt; twice.

I think you may be able to specialize std::tuple_size and std::get for the index table so that it doesn't require any storage even when invoked with non-constexpr arguments; I'm still experimenting but expect an update to this answer!