दिलचस्प पोस्ट
1 9 70 से पहले तारीखों के लिए स्ट्रॉटोम का उपयोग करना वसंत जेसन अनुरोध 406 प्राप्त करना (स्वीकार्य नहीं) टर्नरी ऑपरेटर कैसे काम करता है? तत्वों को एक सामान्य सूची से कैसे हटाएं, जबकि इसे खत्म करना है? अधिकांश पोर्ट पर सुनते समय Node.js EACCES त्रुटि mysql_fetch_array, mysql_fetch_assoc, mysql_fetch_object कैसे मैं "=>" के रूप में लैम्ब्डा अभिव्यक्ति में प्रयोग किया जाता है। नेट स्थिरांक के लिए सी # नामकरण सम्मेलन? क्या कोई UIView resize इवेंट है? Angular2 में सैकड़ों पृष्ठों के साथ वेबसाइट का एहसास कैसे करें क्या $ मिलियन का एक संस्करण है जो कॉल वापस उपयोग नहीं करता है? क्या जावास्क्रिप्ट के साथ एक पॉपअप खोलना संभव है और फिर जब उपयोगकर्ता इसे बंद करता है तो पता लगा सकता है? मैं बच्चा प्रक्रिया कैसे चला सकता हूं जिसकी आवश्यकता है ऊंचाई और इंतजार? एंड्रॉइड – लॉगकेट संदेशों की अधिकतम लंबाई निर्धारित करें मुख्य रननेबल पायथन स्क्रिप्ट मॉड्यूल की तरह पीईसी फाइलों के लिए संकलित क्यों नहीं हैं?

एक 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 () के प्रकार के रूप में देखा जा सकता है।

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