Elegante Initialisierung von std::array mit nicht standardmäßig konstruierbarem Typ
Initialisierung eines std::array mit einem nicht standardmäßigen Typ Die Auswahl eines konstruierbaren Elementtyps kann eine mühsame Aufgabe sein. Das manuelle Wiederholen des Werts n-mal ist bei großen n ineffizient und fehleranfällig.
Um dieses Problem zu beheben, besteht ein eleganterer Ansatz darin, einen Sequenztyp und einen Generator zu verwenden. Die Schlüsselidee besteht darin, eine Folge von Indizes von 0 bis n-1 zu erstellen und dann eine Funktion zu verwenden, um wiederholt einen Wert auf jeden Index anzuwenden.
Hier ist eine Implementierung:
template
auto repeat(T value, seq) -> std::array
{
// Unpack N, repeating `value` sizeof...(N) times
// Note that (X, value) evaluates to value
return {(N, value)...};
}
So initialisieren Sie ein std::array mit diesem Ansatz:
template
void f(T value)
{
// genseq_t is seq
std::array items = repeat(value, genseq_t{});
}
Zusätzlich werden folgende Definitionen verwendet:
template
struct seq
{
using type = seq;
static const std::size_t size = sizeof ... (N);
template
struct push_back : seq {};
};
template
struct genseq : genseq::type::template push_back {};
template
struct genseq : seq {};
template
using genseq_t = typename genseq::type;
Diese Lösung bietet eine effiziente und elegante Möglichkeit, std::array mit nicht standardmäßig konstruierbaren Typen zu initialisieren, unabhängig vom Wert von n.
Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.
Copyright© 2022 湘ICP备2022001581号-3