Ermitteln des "optimalen" allgemeinen numerischen Typs in einem Vorlagenparameterpaket

8

Was ist der beste Weg, um einen gemeinsamen numerischen Typ in einem Template-Parameterpaket mit:

zu bestimmen?
  1. die kleinste Größe,
  2. kein Genauigkeitsverlust und
  3. kein Risiko eines Überlaufs / Unterlaufs beim Konvertieren eines beliebigen Typs im Parameterpack in diesen "idealen" allgemeinen Typ?

Die variadische Vorlage ( best_common_numeric_type ) könnte wie folgt verwendet werden:

%Vor%

Und haben Instanzen wie die folgenden:

%Vor%

Im Fall [4] zum Beispiel müsste ::type signed long sein, da signed int keine unsigned int ohne Überlaufrisiko halten könnte, und umgekehrt unsigned int keine signed int ohne Unterlaufrisiko.

Dasselbe gilt auch in [5], nur dass jetzt ein signed long nicht mehr ausreicht, da das unsigned long nicht ohne Überlaufgefahr gehalten werden kann.

(Die Implementierung könnte Datenmodell spezifisch sein, aber Sie erhalten die Idee.)

Was könnte der beste Weg in C ++ 11 sein, um dies zu erreichen?

    
MikeTusar 17.08.2013, 00:11
quelle

3 Antworten

6

Ich bin ein bisschen spät auf die Party, Hier ist meine Lösung ohne Boost:

%Vor%     
Leonid Volnitsky 17.08.2013, 06:19
quelle
6

Sie können Boost Integer verwenden, um die richtigen Fälle auszuwählen.

Ignorieren Sie für einen Moment die Fälle auf nicht-integralen Elementtypen, hier ist ein kurzer Test der vorgeschlagenen Fälle (GCC hat nicht int128_t , wie es scheint):

Live auf Coliru

%Vor%     
sehe 17.08.2013 02:51
quelle
4

Hinweis: Irgendwie habe ich es in meinem Kopf hängen lassen, dass du C ++ 03 dafür brauchst. Dies kann für C ++ 11 vereinfacht werden. Dies wählt auch nicht die kleinste Größe.

Nach meinem Wissen gibt es dafür keinen Standard, aber es kann gemacht werden: Ссылка

Zuerst die "Denker" Strukturen.

%Vor%

Dann die Basisfälle:

%Vor%

Dann die Tischler:

%Vor%

Und schließlich ein Test:

%Vor%

Ergebnisse:

%Vor%     
Mooing Duck 17.08.2013 02:19
quelle