Ich versuche, eine Farbklasse mit variabler Größe zu erstellen - angesichts einer Vorlage bestimmten Array von Werten, möchte ich benannte Aliase von jedem Wert im Array erstellen, dh:C++ (Irgendwie) Struct auf Eltern Union Größe beschränken
template<int C = 3, typename T = unsigned char>
class Color {
public:
union {
T v[C];
struct {
T r, g, b, a;
};
};
};
Allerdings, wenn ich versuche, die gleiche Klasse für C = 3, die Gewerkschaftsmandate eine Größe von 4 Bytes zu verwenden (das 'a' Mitglied). Alternativ verwendet der Compiler eine mathematisch ausgedrückte Bitfeldgröße für a (Struktur namens a, anonymer T-Member, Größe ergibt 1 bei C> 3) und gibt eine permissive Warnung aus (nicht unterdrückbar, wie in In gcc, how to mute the -fpermissive warning?), etwas ungeeignet für einen größeren -Skala-API.
Wie würde ich gehen über eine einzelne Klasse mit verschiedenen Zahlen von Variablen zu behandeln, unter Beibehaltung per-Variablen-Namen und ohne Implementierung von rekursiven Include-Makro-Magie (versucht, sollte dies nicht haben). Danke im Voraus!
Edit: die Frage zu klären, eine Antwort auf eine der folgenden Bedingungen wird dieses Problem lösen:
- Suppress GCC -fpermissive Fehler (#pragma Diagnose für permissive nicht ignoriert funktioniert)
- Set maximale Größe der Vereinigungs- oder untergeordneten Struktur nicht überschreiten C Bytes
- Erlaube Bitfeldlänge von 0 für Mitglieder, die nicht durch C-Bytes abgedeckt sind (GCC erlaubt mathematische Ausdrücke für Bitfeldlänge wie (C-3> 0) 8: 0;)
- Deaktivieren Sie Member, die nicht durch C Bytes abgedeckt sind, durch einige o ther Mittel (dh mythische static_if())
Also, wenn ich richtig verstehe Sie wollen die Anzahl der Mitglieder der anonymen Struktur mit dem Template-Parameter 'C' variieren? –
Korrekt - im Idealfall könnte so etwas wie ein static_if zusätzliche a, x, y, z, w Mitglieder basierend auf C> = 4 ... – Precursor
einschalten. Brauchst du das 'T v [C]; Fügen Sie es ein, weil Sie erwartet haben, dass es für die Implementierung benötigt wird? – jPlatte