Introduction
A month ago I publlished a custom implementation of std::visit that stores function pointers in a flat one-dimensional array. If you haven’t read it, start there - this post builds directly on top of it.
visit implementation using flat arrays
For completeness, he is the implementation of visit using a one-dimensional array.
visit implementation using multi-dimensional arrays
A multidimensional array type can be easily coded up as follows:
namespace qc{
/**
* @brief A light n-dimensional array.
*/
template<typename T, std::size_t Size>
struct poly_array{
T m_buffer[Size] = {};
constexpr T& operator[](std::size_t idx){
return m_buffer[idx];
}
// Base case
decltype(auto) constexpr at(std::size_t index){
return m_buffer[index];
}
// Case with a pack of indices
template<typename... Indices>
decltype(auto) constexpr at(std::size_t index, Indices... indices){
return m_buffer[index].at(indices...);
}
};
}The .at(std::size_t, Indices...) method accepts a variadic pack of indices. As a concrete example, if I define a multi-dimensional array a of dimensions \(2 \times 3 \times 4\), a is a collection of two \(3 \times 4\) matrices. So, a.at(0,1,2) is (1,2)-th element in the 0-th matrix. Hence, we should recursively invoke a[0].at(1,2).
Here is the complete code-listing.