2016-10-08 4 views
11

एक सामान्य मामले में सार कोड को निम्नलिखित कोड में कैसे कार्यान्वित किया जाए। कोड उस लाइब्रेरी से सरलीकृत है जिस पर मैं काम कर रहा हूं। तो int और double के लिए एक स्पष्ट कार्यान्वयन एक विकल्प नहीं है।एक अमूर्त विधि को कार्यान्वित करने के लिए कैसे करें जब अमूर्त वर्ग का प्रयोग एक भिन्न संदर्भ में

template <typename T> 
struct Foo 
{ 
    virtual void send(T t) = 0; 
}; 

template <typename...T> 
struct Bar : Foo<T>... 
{ 
    void send(T t) override { // does not compile because 
          // abstract method not implemented 
    } 
}; 

int main() { 
    // example usage 
    Bar<int, double> b; 

    b.send(1); 
    b.send(2.3); 
} 

अग्रिम में बहुत धन्यवाद।

संपादित करें: अमूर्त विधि में आभासी जोड़ा गया।

उत्तर

6

निम्नलिखित उदाहरण के बारे में क्या?

सबसे पहले, मुझे लगता है कि आपको virtualsend() विधि Foo (यदि आप इसे शुद्ध वर्चुअल चाहते हैं) को परिभाषित करने की आवश्यकता है।

इसके बाद, आप एक मध्यवर्ती टेम्पलेट वर्ग (Foo2) जहां overridesend()

अंतिम लागू घोषणा कर सकते हैं, तो आप सही आभासी send() विधि का चयन करने Bar में टेम्पलेट send() विधि का उपयोग कर सकते हैं।

#include <iostream> 

template <typename T> 
struct Foo 
{ virtual void send(T t) = 0; }; 

template <typename T> 
struct Foo2 : Foo<T> 
{ 
    void send(T) override 
    { std::cout << "sizeof[" << sizeof(T) << "] " << std::endl; } 
}; 

template <typename...T> 
struct Bar : Foo2<T>... 
{ 
    template <typename U> 
    void send (U u) 
    { Foo2<U>::send(u); } 
}; 

int main() 
{ 
    Bar<int, double> b; 

    b.send(1); // print sizeof[4] 
    b.send(2.3); // print sizeof[8] 
} 
+0

अरे, क्या आप मुझे बता सकते हैं कि क्या अंतर के बीच है: 'foo2 ...' और 'foo2 ' (डॉट्स के बाहर ब्रैकेट ब्रैकेट अंदर बनाम) – Brandon

+0

@Brandon - पूरी तरह से अलग अलग बातें कर रहे हैं; यदि आप 'Foo2 ' लिखते हैं, तो आप 'size2 ... (T) 'टेम्पलेट पैरामीटर के साथ एक एकल बेस क्लास,' Foo2 ' घोषित करते हैं; यदि आप 'Foo2 ...' लिखते हैं, तो आप 'sizeof ... (टी) 'बेस क्लास,' Foo2 , Foo2 , Foo2 /* आदि * /', प्रत्येक टेम्पलेट पैरामीटर के साथ घोषित करते हैं – max66

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