दिलचस्प पोस्ट
क्या कोई भी खुला स्रोत सी पुस्तकालय सामान्य डेटा संरचनाओं के साथ हैं? ObjectiveC में NSDictionary ऑब्जेक्ट से यूआरएल क्वेरी पैरामीटर बनाना सीएसएस – कैसे स्क्रीन से पूरी चौड़ाई के लिए div से अतिप्रवाह टंकिनर पाठ विजेट में टेक्स्ट को कैसे उजागर करें ईमेल में इनलाइन छवि भेजें Xcode 6 में स्टोरीबोर्ड में "मार्जिन पर नियंत्रण" क्या है स्व-उत्पन्न प्रॉक्सी के पीछे मेवेन एंड्रॉइड पर समर्थित भाषाओं / लोकेल की सूची क्या है? लोगो के साथ 3 नेविबार बूटस्ट्रैप पीपी 5 में इनलाइन स्ट्रिंग्स बनाम कंसैटनेशन का उपयोग करने में गति अंतर? लगभग बराबर लम्बाई के एन भागों में एक सूची को विभाजित करना मैं एंड्रॉइड में गोल कोनों के साथ एक सूची दृश्य कैसे बना सकता हूं? Bitwise ऑपरेटर क्या हैं? माइक्रोसॉफ्ट एसक्यूएल सर्वर 2005 में MySQL फ़ंक्शन में समयावधि? जांचें कि क्या एक पायथन सूची आइटम में एक स्ट्रिंग के अंदर एक स्ट्रिंग है

एक variadic टेम्पलेट फ़ंक्शन के साथ decltype का उपयोग करके वापस आने वाले प्रकार

मैं एक साधारण योजक (गीगल्स के लिए) लिखना चाहता हूं जो हर तर्क को जोड़ता है और उचित प्रकार के साथ एक योग देता है। वर्तमान में, मुझे यह मिला है:

#include <iostream> using namespace std; template <class T> T sum(const T& in) { return in; } template <class T, class... P> auto sum(const T& t, const P&... p) -> decltype(t + sum(p...)) { return t + sum(p...); } int main() { cout << sum(5, 10.0, 22.2) << endl; } 

जीसीसी 4.5.1 पर यह 2 तर्कों के लिए ठीक काम करता है उदा। सम (2, 5.5) 7.5 के साथ रिटर्न। हालांकि, इससे अधिक तर्क के साथ, मुझे ऐसी त्रुटियां मिलती हैं जो राशि () को अभी तक परिभाषित नहीं की गई है। अगर मैं इस तरह की राशि () घोषित करता हूं:

 template <class T, class P...> T sum(const T& t, const P&... p); 

फिर यह किसी भी संख्या के तर्कों के लिए काम करता है, लेकिन योग (2, 5.5) पूर्णांक 7 लौटाएगा, जो कि मैं क्या उम्मीद नहीं करता। दो से अधिक तर्कों के साथ मैं मानता हूं कि decltype () को किसी प्रकार के recursion करने के लिए टी + राशि (पी …) का प्रकार निकालने में सक्षम होना होगा। क्या यह कानूनी सी ++ 0x है? या decltype () केवल गैर- variadic घोषणाओं के साथ काम करता है? अगर ऐसा मामला है, तो आप ऐसा फ़ंक्शन कैसे लिखेंगे?

वेब के समाधान से एकत्रित समाधान "एक variadic टेम्पलेट फ़ंक्शन के साथ decltype का उपयोग करके वापस आने वाले प्रकार"

मुझे लगता है कि समस्या यह है कि variadic फ़ंक्शन टेम्पलेट को केवल इसके रिटर्न प्रकार को निर्दिष्ट करने के बाद ही माना जाता है, ताकि decltype में sum कभी भी वैराडीक फ़ंक्शन टेम्पलेट को संदर्भित न करें। लेकिन मुझे यकीन नहीं है कि यह एक जीसीसी बग है या सी ++ 0x बस इस की अनुमति नहीं देता है। मेरा अनुमान है कि सी ++ 0x ->decltype(expr) भाग में "पुनरावर्ती" कॉल की अनुमति नहीं देता है

एक वैकल्पिक हल के रूप में हम कस्टम गुण वर्ग के साथ " ->decltype(expr) " कॉल ->decltype(expr) से बच सकते हैं:

 #include <iostream> #include <type_traits> using namespace std; template<class T> typename std::add_rvalue_reference<T>::type val(); template<class T> struct id{typedef T type;}; template<class T, class... P> struct sum_type; template<class T> struct sum_type<T> : id<T> {}; template<class T, class U, class... P> struct sum_type<T,U,P...> : sum_type< decltype( val<const T&>() + val<const U&>() ), P... > {}; 

इस प्रकार, हम आपके प्रोग्राम में typename sum_type<T,P...>::type साथ बदल सकते हैं और यह संकलन करेगा।

संपादित करें: चूंकि यह वास्तव में decltype((a+b)+c) बजाय decltype((a+b)+c) decltype(a+(b+c)) जो आप इसके अतिरिक्त उपयोग कैसे कर सकते हैं, इसके साथ आप पिछले विशेषज्ञ को इसके साथ बदल सकते हैं:

 template<class T, class U, class... P> struct sum_type<T,U,P...> : id<decltype( val<T>() + val<typename sum_type<U,P...>::type>() )>{}; 

जाहिरा तौर पर आप एक रिकर्सिव तरीके से डेल्प्टाइप का उपयोग नहीं कर सकते (कम से कम इस पल के लिए, शायद वे इसे ठीक कर देंगे)

आप राशि के प्रकार को निर्धारित करने के लिए एक टेम्पलेट संरचना का उपयोग कर सकते हैं

यह बदसूरत दिखता है लेकिन यह काम करता है

 #include <iostream> using namespace std; template<typename... T> struct TypeOfSum; template<typename T> struct TypeOfSum<T> { typedef T type; }; template<typename T, typename... P> struct TypeOfSum<T,P...> { typedef decltype(T() + typename TypeOfSum<P...>::type()) type; }; template <class T> T sum(const T& in) { return in; } template <class T, class... P> typename TypeOfSum<T,P...>::type sum(const T& t, const P&... p) { return t + sum(p...); } int main() { cout << sum(5, 10.0, 22.2) << endl; } 

सी + 14 का समाधान:

 template <class T, class... P> auto sum(const T& t, const P&... p){ return t + sum(p...); } 

वापसी प्रकार स्वचालित रूप से कटौती की जाती है

इसे ऑनलाइन संकलक में देखें

C ++ 11 के std::common_type का उपयोग करके कम टाइपिंग के साथ अंतिम प्रश्न का दूसरा उत्तर: बस का उपयोग करें

 std::common_type<T, P ...>::type 

आपके वैराइडिश राशि का रिटर्न प्रकार के रूप में

std::common_type बारे में, यहां http://en.cppreference.com/w/cpp/types/common_type से एक अंश है:

अंकगणित प्रकारों के लिए, सामान्य प्रकार को (संभवतः मिश्रित मोड) अंकगणितीय अभिव्यक्ति जैसे कि टी 0 () + T1 () + … + Tn () के प्रकार के रूप में देखा जा सकता है।

लेकिन जाहिर है यह केवल अंकगणित अभिव्यक्ति के लिए काम करता है और सामान्य समस्या का इलाज नहीं करता है।