cpp / expert
Snippet
Kompilierzeit-Validierung für statische Arrays
Dieses Snippet zeigt, wie man Templates und static_assert verwendet, um Array-Grenzprüfungen zur Kompilierzeit zu erzwingen. Durch die Verwendung eines Template-Parameters für den Index kann der Compiler den Zugriff außerhalb der Grenzen verhindern, noch bevor der Code ausgeführt wird, was effizienter und sicherer als Laufzeitprüfungen ist.
snippet.cpp
cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <array>#include <stdexcept>#include <utility>template <typename T, std::size_t N>struct CheckedArray {std::array<T, N> data;template <std::size_t Index>constexpr const T& get() const {static_assert(Index < N, "Array index out of bounds!");return data[Index];}template <typename... Args>static constexpr CheckedArray create(Args&&... args) {return { {std::forward<Args>(args)...} };}};
Erklärung
1
template <typename T, std::size_t N>
Definiert eine Template-Klasse, die einen Typ und eine konstante Größe erwartet.
2
static_assert(Index < N, "...");
Löst einen Kompilierfehler aus, wenn der angeforderte Index die Array-Größe überschreitet.
3
std::forward<Args>(args)...
Verwendet Perfect Forwarding, um das interne Array mit Konstruktorargumenten zu initialisieren.