2017-06-16 3 views
14

Ich versuche, eine Klasse zu schreiben, die eine Variable enthält, deren Typ so klein wie möglich gewählt würde, um einen Wert zu enthalten.Wählen Sie den kleinsten Integer-Typ basierend auf einem Gleitkomma

Was ich meine ist:

class foo { 
"int type here" a; 
} 

ich über Automatically pick a variable type big enough to hold a specified number kam. Aufgrund von Schwierigkeiten mit der Boost-Bibliothek ging ich weiter und nutzte die Vorlagenvorschläge.

, dass der Code in die Kurven:

template<unsigned long long T> 
class foo { 
SelectInteger<T>::type a; 
} 

Allerdings stellt sich mein Problem aus der Tatsache, dass die Größe der Variable ein Ergebnis ist eine Gleitkomma-Variable und der ganzen Zahl multipliziert wird. Deshalb, was ich möchte in der Lage sein zu tun ist:

template<unsigned long long T, double E> 
class foo { 
SelectInteger<T*E>::type a; 
} 

Aber da Vorlagen arbeiten nicht mit Punktvariablen Floating (siehe here), kann ich nicht E in einer Vorlage übergeben. Gibt es eine andere Möglichkeit, eine Variable (die während der Kompilierung verfügbar sein sollte) an die Klasse zu übergeben?

Antwort

8

Wie wäre es mit einer constexpr Funktion?

ich meine ... etwas wie folgt

template <unsigned long long> 
struct SelectInteger 
{ using type = int; }; 

template <> 
struct SelectInteger<0U> 
{ using type = short; }; 

constexpr unsigned long long getSize (unsigned long long ull, double d) 
{ return ull*d; } 

template <unsigned long long T> 
struct foo 
{ typename SelectInteger<T>::type a; }; 

int main() 
{ 
    static_assert(std::is_same<short, 
        decltype(foo<getSize(1ULL, 0.0)>::a)>::value, "!"); 
    static_assert(std::is_same<int, 
        decltype(foo<getSize(1ULL, 1.0)>::a)>::value, "!!"); 
} 
+0

nie über constexpr kannte. Danke vielmals. –

Verwandte Themen