2017-03-06 7 views
5

Ich habe den folgenden Code:C++ Typ der Variablen abhängig vom Kontext machen?

// Case #1 
float f = 1.0f; 
float f2 = sqrt(f * pi); 

// Case #2 
double d = 1.0; 
double d2 = sqrt(d * pi); 

Gibt es eine Möglichkeit die Variable pi so zu definieren, dass operator* und sqrt 1 auf float s in Case # arbeiten, sondern wird auf double s in Case # 2 arbeiten?

Vielleicht könnte es mit C++ 14 variablen Vorlagen möglich sein?

Antwort

11

Sortieren von. Sie können sicherlich definieren eine solche pi:

template <class T> constexpr double pi = 3.14159...; 
template <> constexpr long double pi<long double> = 3.14159...L; 
template <> constexpr float pi<float> = 3.14159...F; 

Aber Sie müssen angeben, welche pi Sie wollen:

float f2 = sqrt(f * pi<float>); 
double d2 = sqrt(d * pi<double>); 

Mehr direkt, Sie könnten etwas pi Objekt definieren, hat operator* gerade überlastet je auf dem typ:

struct Pi { 
    template <class T> 
    decltype(pi<T>) operator*(T val) { return val * pi<T>; } 

    template <class T> 
    friend decltype(pi<T>) operator*(T val, Pi) { return pi<T> * val; } 
}; 

Damit können Sie die gewünschte Syntax erhalten, aber das ist seltsam, tun Sie es nicht.

+0

@LWimsey Ja, Tippfehler, danke. – Barry

+0

@ T.C. So ähnlich? – Barry

+0

Sie können es einfacher machen - Standardimplementierung sollte "double" -Wert anstelle von "int" definieren. 'Vorlage constexpr Doppel-pi = 3,0;' – Orient

Verwandte Themen