दिलचस्प पोस्ट
एक Log4Net आवरण वर्ग क्या दिखता है? सभी तालिकाएं कैसे प्राप्त करेंगी जो कि विदेशी कुंजियां हैं, जो कि विशिष्ट तालिका.column का संदर्भ देते हैं और उन विदेशी कुंजी के लिए मान हैं? आत्मा क्यूई के एकल-सदस्यीय संरचना के साथ विशेषता प्रसार का मुद्दा क्या मैं सिग्नलआर और एक रीसेट एपीआई दोनों को शामिल कर सकता हूं? मैं एक पायथन प्रोग्राम को runnable .exe विंडोज प्रोग्राम में कैसे रूपांतरित कर सकता हूं? एसडीसीडी तैयार करने के लिए एंड्रॉइड इंटेन्ट पृष्ठभूमि वर्क के लिए काम समानांतर पुस्तकालय प्रतिस्थापन? Ansible / bin / sh: 1: / usr / bin / python के साथ विफल रहता है: नहीं मिला कैसे जावा में सरणी तत्वों अस्थिर घोषित करने के लिए? केवल पंक्ति लौटें अगर मूल्य मौजूद नहीं है उद्देश्य सी कोको आवेदन में नियमित अभिव्यक्ति सरलएक्सएमएल एक नोड में एक बच्चे को कैसे शामिल करें? गतिविधि से किसी सेवा के तरीकों को कैसे कॉल करें? जब मैं सेटटिमेउट का उपयोग करता हूं तो विधि तुरंत निष्पादित क्यों होती है? संसाधनों से DisplayName विशेषता?

मैं variadic टेम्पलेट आधार वर्गों के लिए कॉल का विस्तार कैसे कर सकता हूं?

मेरे पास गैर-ऑर्थोगोनल नीतियों का एक सेट है, जो सभी एक सामान्य नामित विधि को लागू करते हैं, नीतियां सुरक्षा जांच को जोड़ती हैं मैं चाहता हूं कि उपयोगकर्ता नीतियों को गठबंधन करने में सक्षम हों ताकि प्रत्येक संयोजन के मामले के लिए हाथों से नीतियां न बनाए और अधिक जटिल मान्यता दी जा सके। मेरा दृष्टिकोण दूसरों को जोड़ने के लिए एक नई नीति वर्ग बना रहा है

नीचे दिया गया सरलीकृत उदाहरण सी को संयोजन वर्ग के रूप में दिखाता है, यहां विधि आईडी संयुक्त है। अपेक्षित परिणाम यह है, जब सी पर आईडी को कॉल किया जाता है, क्रमिक रूप से प्रत्येक बेस वर्ग के आईडी को कॉल करने के लिए।

#include <iostream> using namespace std; struct A { void id() { cout << "A ";} }; struct B { void id() { cout << "B ";} }; template<class A, class... As> struct C : public A, public As... { void id() { A::id(); As...::id(); // This line does not work, it is illustrative. } }; int main() { C<A, B> c; c.id(); //expected: result AB } 

सवाल यह है: क्या इसका विस्तार करना संभव है … किसी तरह एक पुनरावर्ती दृष्टिकोण का उपयोग किए बिना ऐसा करने के लिए, बस … ऑपरेटर का उपयोग कर?

Solutions Collecting From Web of "मैं variadic टेम्पलेट आधार वर्गों के लिए कॉल का विस्तार कैसे कर सकता हूं?"

ज़रूर। आपको एक ऐसे संदर्भ की आवश्यकता है जो पैक विस्तार की अनुमति देती है – एक सरल एक ताज़ा प्रारंभिक सूची है, जिसमें बाएं से सही मूल्यांकन की गारंटी भी मिलती है:

 using expander = int[]; (void) expander { 0, ((void) As::id(), 0)... }; 
  • ... इसके बाईं ओर एक पैटर्न फैलता है; इस मामले में पैटर्न अभिव्यक्ति है ((void) As::id(), 0)

  • , अभिव्यक्ति में कॉमा ऑपरेटर है, जो पहले ऑपरेंड का मूल्यांकन करता है, नतीजे निकालता है, फिर दूसरा ऑपरेंड का मूल्यांकन करता है, और परिणाम देता है।

  • (void) As::id() डाला As::id() अतिभारित operator, खिलाफ की रक्षा करने के लिए मौजूद है, और अगर आप सुनिश्चित हैं कि एएस As::id() कॉल में से कोई भी कुछ ऐसा नहीं करेगा जो कोमा ऑपरेटर को ओवरलोड कर देगा
  • 0 कॉमा ऑपरेटर के दाहिने हाथ पर है, क्योंकि expander एक expander है, इसलिए संपूर्ण अभिव्यक्ति (जो सरणी के तत्व को आरम्भ करने के लिए उपयोग की जाती है) को एक int लिए मूल्यांकन करना चाहिए
  • पहले 0 यह सुनिश्चित करता है कि हम एक अवैध 0-आकार की सरणी बनाने का प्रयास न करें जब एक रिक्त पैक हो।

डेमो


सी ++ 17 (यदि हम भाग्यशाली हैं) में, C::id का संपूर्ण शरीर एक बाइनरी गुना अभिव्यक्ति से बदला जा सकता है: (A::id(), ... , (void) As::id()); डेमो