2017-03-06 25 views
5

Mam następujący kod:C++ czy typ zmiennej zależy od kontekstu?

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

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

Czy jest jakiś sposób, aby zdefiniować zmienną pi tak że operator* i sqrt będzie działać na float s w przypadku # 1, ale będzie działać na double s w przypadku # 2?

Być może jest to możliwe z szablonami zmiennymi C++ 14?

Odpowiedz

11

Sortuj. z pewnością można określić taki 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; 

Ale trzeba określić, które pi chcesz:

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

Bardziej bezpośrednio, można określić pewne pi obiekt, który właśnie został przeciążony operator* zależności na 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; } 
}; 

Pozwala ci uzyskać pożądaną składnię, ale to dziwne, nie rób tego.

+0

@ LWimsey Tak, literówka, dzięki. – Barry

+0

@ T.C. Coś w tym stylu? – Barry

+0

Możesz uczynić go prostszym - domyślna implementacja powinna definiować wartość "double" zamiast "int". 'template constexpr double pi = 3.0;' – Orient

Powiązane problemy