2017-03-06 8 views
5

मैं निम्नलिखित कोड:सी ++ चर का प्रकार संदर्भ पर निर्भर करता है?

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

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

वहाँ चर pi परिभाषित करने के लिए कोई तरीका है ताकि operator* और sqrt प्रकरण # 1 में float रों पर काम करेंगे, लेकिन प्रकरण # 2 में double रों पर काम करेगा?

शायद सी ++ 14 परिवर्तनीय टेम्पलेट्स के साथ यह संभव हो सकता है?

उत्तर

11

क्रमबद्ध करें। आप निश्चित रूप से परिभाषित कर सकते हैं इस तरह के एक 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; 

लेकिन तुम जो pi आप चाहते हैं निर्दिष्ट करने की आवश्यकता:

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

अधिक सीधे, आप कुछ pi उद्देश्य यह है कि सिर्फ operator* अतिभारित है निर्भर करता है निर्धारित कर सकते हैं प्रकार:

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

यह आपको सिंटैक्स प्राप्त करने देता है, लेकिन यह अजीब है, इसे मत करो।

+0

@LWimsey Yep, टाइपो, धन्यवाद। – Barry

+0

@ टी.सी. ऐसा कुछ? – Barry

+0

आप इसे सरल बना सकते हैं - डिफ़ॉल्ट कार्यान्वयन को 'int' के बजाय 'डबल' मान परिभाषित करना चाहिए। 'टेम्पलेट constexpr डबल पीआई = 3.0;' – Orient

संबंधित मुद्दे