नीचे दिया गया उदाहरण एक कम से कम ज्ञात मुहावरे का एक अच्छा उदाहरण है, शायद इतना अच्छा उदाहरण नहीं है।
यह संकलित करता है और यह कम से कम बनाए रखने में सक्षम होने के लिए इतना बदसूरत है, क्योंकि प्रश्न मुहावरे के बारे में नहीं है।टाइप एरर और वैरैडिक टेम्पलेटेड सदस्य फ़ंक्शन
struct Foo {
virtual void fn() = 0;
};
template<class T>
struct Bar: public Foo {
void fn() override {
T{}.fn();
}
};
struct S {
void fn() { }
};
int main() {
Foo *foo = new Bar<S>{};
foo->fn();
}
क्या मैं के साथ के बाद से एक घंटे पहले (या यहां तक कि अगर वहाँ एक विकल्प मुहावरा मौजूद है) उसे बदलने का तरीका है एक variadic टेम्पलेट सदस्य विधि लागू करने के लिए संघर्ष कर रहा हूँ।
जाहिर है, मैं Foo
वर्ग के फ़ंक्शन को संशोधित नहीं कर सकता, क्योंकि यह एक आभासी है और वर्चुअल विनिर्देशक टेम्पलेट्स के साथ नहीं जाता है। Bar
के विनिर्देश के लिए मान्य है, क्योंकि इसे बेस क्लास में किसी भी तरह से ओवरराइड करना है।
नोट।
मैं दृढ़ता से संदेह के लिए इस सवाल का सबसे बड़ा XYProblem कभी देखा में से एक हो सकता है, मैं यह भी पसंद वास्तविक समस्या का एक संक्षिप्त विवरण देने के लिए चाहते हैं।
मैं एक वर्ग है कि दो टेम्प्लेटेड सदस्य तरीकों को उजागर करता है:
पहले एक एक टेम्पलेट वर्ग
T
जाता है कि तुरंत इस्तेमाल नहीं स्वीकार करता है, बजाय इसे संग्रहीत होना चाहिए किसी भी तरह के क्रम में बाद में प्रयोग की जाने वाली ।दूसरा दूसरा तर्कों की एक भिन्न संख्या स्वीकार करता है (यह वास्तव में एक विविध टेम्पलेट सदस्य कार्य है) और उन तर्कों को
T
के नव निर्मित उदाहरण के लिए पूरी तरह से अग्रेषित किया जाना चाहिए।
ठीक है, समस्या कहीं अधिक जटिल है, लेकिन यह एक अच्छा अनुमान है और आपको यह लक्ष्य देना चाहिए कि लक्ष्य क्या है।
संपादित
मुझे लगता है कि यह किसी भी तरह उच्च आदेश कार्यों के समान है।
मेरा मतलब है, समस्या का समाधान क्या होगा वास्तव में एक तर्कसंगत कार्य है जिसमें पहली तर्क को बांधना है, लेकिन जहां तक मुझे पता है कि यह असंभव है और साथ ही साथ किसी भी अन्य दृष्टिकोण को मैंने अभी तक खोजा है।
कोई व्यवहार्य समाधान जो एक ही अवधारणा को व्यक्त करता है?तो अब
template<typename T> class Factory {
public:
template<typename ...Args>
auto construct(Args && ...args)
{
return T(std::forward<Args>(args)...);
}
};
, अपने पहले उजागर वर्ग विधि कुछ इस तरह होगा::
आपका बड़ा लक्ष्य रनटाइम और संकलन-समय गतिशीलता को गठबंधन करना है जिस तरह से मुझे संदेह है कि संभव नहीं है, लेकिन मुझे यह देखने के लिए उत्सुकता होगी कि मेरे साथ क्या चतुर लोग आते हैं। – zwol
@zwol मुझे बिल्कुल वही अनुभव है, यही कारण है कि मैंने SO पर पूछा है !! :-) – skypjack
निश्चित रूप से, * सदस्य फ़ंक्शन टेम्पलेट वर्चुअल * –