2017-03-06 28 views
5

Ben şu kod:C++ değişkeni bağlama bağlı mı?

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

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

değişken pi tanımlamak için herhangi bir yolu var mı öylesine operator* ve sqrt Vaka # 1'de float s tarihinde çalışacaktır ancak Case # 2'de double s tarihinde çalışacağını?

Belki de C++ 14 değişken şablonları ile mümkün olabilir?

cevap

11

Sıralama. Kesinlikle tanımlayabilirsiniz böyle bir 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; 

Ama istediğiniz pi belirtmek zorunda:

float f2 = sqrt(f * pi<float>); 
double d2 = sqrt(d * pi<double>); 
Daha doğrudan

, sadece bağlı operator* aşırı yüklenmiş bazı pi nesneyi tanımlayabilir türü:

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; } 
}; 

İstediğiniz sözdizimini almanıza izin verir, ama bu garip, yapma.

+0

@LWimsey Yep, yazım hatası, teşekkürler. – Barry

+0

@ T.C. Bunun gibi bir şey? – Barry

+0

Basitleştirebilirsiniz - varsayılan uygulama 'int' yerine' double' değerini tanımlamalıdır. Şablon constexpr çift pi = 3.0; – Orient