constexpr Initialisierung des Arrays zum Sortieren von Inhalten
Dies ist eher ein kleines Rätsel als ein reales Problem, aber ich bin in eine Situation geraten, in der ich in der Lage sein möchte, etwas zu schreiben, das sich genau so verhält
template<int N>
struct SortMyElements {
int data[N];
template<typename... TT>
SortMyElements(TT... tt) : data{ tt... }
{
std::sort(data, data+N);
}
};
int main() {
SortMyElements<5> se(1,4,2,5,3);
int se_reference[5] = {1,2,3,4,5};
assert(memcmp(se.data, se_reference, sizeof se.data) == 0);
}
außer dass ich das willSortMyElements
Konstruktor zu seinconstexpr
.
Offensichtlich ist dies bei Festnetz möglichN
; Ich kann mich zum Beispiel spezialisieren
template<>
struct SortMyElements<1> {
int data[1];
constexpr SortMyElements(int x) : data{ x } {}
};
template<>
struct SortMyElements<2> {
int data[2];
constexpr SortMyElements(int x, int y) : data{ x>y?y:x, x>y?x:y } {}
};
Aber wie verallgemeinere ich das in etwas, das funktionieren wird?irgendein N
?
Bitte beachten Sie, dass die Array-Elemente aus den tatsächlichen Werten der Argumente stammen müssen, nicht aus Argumenten ohne Typvorlage. meine elemente kommen vonconstexpr
Ausdrücke, die, obwohl sie zur Kompilierungszeit ausgewertet werden, fest im "Wertesystem" und nicht im "Typensystem" verankert sind. (Zum Beispiel,Boost.MPL'ssort
arbeitet streng innerhalb des "Typensystems".)
Ich habe eine funktionierende "Antwort" gepostet, aber es ist zu ineffizient, um dafür zu arbeitenN > 6
. Ich würde das gerne mit verwenden2 < N < 50
oder so ungefähr.
(PS: Eigentlich möchte ich alle Nullen in einem Array an das Ende des Arrays mischen und die Werte ungleich Null nach vorne packen, was möglicherweise einfacher ist als eine vollständige Sortierung einfacher zu beschreiben. Fühlen Sie sich frei, das Problem der "Zufälligen Nullen" anzugehen, anstatt zu sortieren.)