Ich habe einige der neuen Funktionen von C++ 11 untersucht und bin sehr beeindruckt von einigen von ihnen, insbesondere die benutzerdefinierten Literale. DieseWie kleinste Variable mit C++ 11 benutzerdefinierten Literalen
können Sie Literale des Formulars definieren 999_something
wo something
Kontrollen, was mit dem 999
getan wird, um die wörtliche zu erzeugen. Also nicht mehr mit verwenden:
#define MEG * 1024 * 1024
int ten_meg = 10 M;
Ich dachte, dies wäre schön Unterstrichen in großen Stückzahlen zu implementieren, wie 1_000_000_blah
, die die Lesbarkeit von Perl passen würden, obwohl die Idee, dass Perl irgendwie lesbar ist ziemlich witzig scheint Ich :-)
Es wäre auch praktisch für binäre Werte wie 1101_1110_b
und 0011_0011_1100_1111_b
.
Offensichtlich wegen der _
Zeichen, müssen diese Rohmodus-Typ sein, eine C-Zeichenfolge verarbeiten, und ich bin damit einverstanden.
Was ich kann nicht herauszufinden, wie Sie einen anderen Typ basierend auf der Operandengröße liefern. Zum Beispiel:
1101_1110_b
sollen eine char
(unter der Annahme char
8-Bit natürlich) geben, während:
0011_0011_1100_1111_b
einen 16-Bit-Typen liefern würde.
Ich kann die Länge des Operanden innerhalb der Literaloperatorfunktion operator""
selbst erhalten (durch das Zählen von Ziffernzeichen), aber der Rückgabetyp scheint auf die Funktion festgelegt zu sein, so dass ich keinen anderen Typ basierend darauf zurückgeben kann.
Kann dies mit einem einzigen Suffix _b
innerhalb der benutzerdefinierten Typen Rahmen durchgeführt werden, oder muss ich (_b8
, _b16
usw.) und bieten meistens doppelte Funktionen zu spalten auseinander manuell die Typen zurückgreifen zu müssen?
Ich bin nicht sicher, ob das funktioniert, aber Sie könnten versuchen, mehrere Literal-Operator-Vorlagen für verschiedene Bit-Zahlen zu überladen. – celtschk
Es funktioniert anscheinend: http://akrzemi1.wordpress.com/2012/10/29/user-defined-literals-part-iii/ - Ich denke, dass das dort gegebene Template ziemlich einfach zu erweitern sein sollte, um mehr Typen zu unterstützen. – celtschk
Wenn ich noch einmal darüber nachdenke, was wahrscheinlich * nicht * funktioniert, benutzt Unterstriche als Teil der Nummer: IIUC '1101_1110_b' wird * nicht * Aufruf' Operator' "_b' mit (Vorlage) Argument' 1101_1110', aber 'Operator" "_1110_b" mit (Vorlage) Argument '1101'. – celtschk