cpp / expert
Snippet
Statische mehrdimensionale Offsets
Array-Indizierung auf Expertenniveau unter Verwendung von variadischen Templates und Fold-Expressions. Dies ermöglicht die Berechnung von flachen Offsets in einem mehrdimensionalen Raum zur Kompilierzeit bei gleichzeitiger Beibehaltung einer sauberen Syntax.
snippet.cpp
cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
template <size_t... Dims>struct MultiArray {static constexpr size_t total_size = (Dims * ...);int data[total_size];template <typename... Indices>constexpr int& operator()(Indices... idxs) {static_assert(sizeof...(Indices) == sizeof...(Dims), "Dimension mismatch");return data[calculate_offset<0>(idxs...)];}private:template <size_t I, typename First, typename... Rest>constexpr size_t calculate_offset(First f, Rest... r) {constexpr size_t stride = get_stride<I + 1>();return (f * stride) + (sizeof...(Rest) > 0 ? calculate_offset<I + 1>(r...) : 0);}template <size_t I>static constexpr size_t get_stride() {size_t dims[] = {Dims...};size_t s = 1;for (size_t j = I; j < sizeof...(Dims); ++j) s *= dims[j];return s;}};
Erklärung
1
static constexpr size_t total_size = (Dims * ...);
Verwendet eine C++17 Fold-Expression, um die benötigte Gesamtgröße des flachen Arrays zur Kompilierzeit zu berechnen.
2
static_assert(sizeof...(Indices) == sizeof...(Dims), ...);
Stellt sicher, dass die Anzahl der angegebenen Indizes exakt mit den definierten Dimensionen des Arrays übereinstimmt.