Programmgesteuertes Generieren statischer Arrays zur Kompilierungszeit in C
Angesichts der Möglichkeit, statische Arrays zur Kompilierungszeit in C zu definieren, ist dies möglich ihre Werte mithilfe von Metaprogrammierungstechniken programmatisch zuweisen?
Frage 1: Programmatische Zuweisung von Array-Werten
Ja, mit C 0x-Funktionen ist es möglich, Array-Elemente „programmgesteuert“ zur Kompilierungszeit zu initialisieren. Betrachten Sie das folgende Beispiel:
template<unsigned... args> struct ArrayHolder { static const unsigned data[sizeof...(args)]; }; template<unsigned... args> const unsigned ArrayHolder<args...>::data[sizeof...(args)] = { args... };
Frage 2: Selektive Zuweisung von Array-Werten
Angenommen, das Array enthält mit einigen Ausnahmen wiederkehrende Werte, ist eine selektive Zuweisung möglich Werte programmgesteuert:
template<size_t N, template<size_t> class F, unsigned... args> struct generate_array_impl { typedef typename generate_array_impl<N-1, F, F<N>::value, args...>::result result; }; template<template<size_t> class F, unsigned... args> struct generate_array_impl<0, F, args...> { typedef ArrayHolder<F<0>::value, args...> result; }; template<size_t N, template<size_t> class F> struct generate_array { typedef typename generate_array_impl<N-1, F>::result result; };
Verwendung für das Array mit wiederkehrenden Nullen außer für Elemente 2 und 3:
template<size_t index> struct MetaFunc { enum { value = index == 2 || index == 3 ? index + 1 : 0 }; }; void test() { const size_t count = 7; typedef generate_array<count, MetaFunc>::result A; for (size_t i=0; i<count; ++i) std::cout << A::data[i] << "\n"; }
Obwohl diese Lösungen durch die maximale Instanziierungstiefe der Vorlage begrenzt sind, demonstrieren sie das Potenzial von C 0x für die programmgesteuerte Array-Erstellung und -Initialisierung.
Das obige ist der detaillierte Inhalt vonKönnen C 0x-Metaprogrammierungstechniken verwendet werden, um statischen Arrays zur Kompilierungszeit programmgesteuert Werte zuzuweisen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!