मैं वर्तमान में टेम्प्लेट के साथ संघर्ष कर रहा हूं: मेरे पास एक टेम्प्लेटेड क्लास A है, जो बुनियादी गणित (फ्लोट्स, डबल्स, कॉम्प्लेक्स नंबरों के लिए) करता है और इस तरह दिखता है

template <typename T>
class A
{  
public:
    void foo(std::vector<std::complex<T>>& result);
};

अब मैं A<double>, A<float> जैसे वर्ग का उपयोग कर सकता हूं, लेकिन मैं इसे A<std::complex<float>> और A<std::complex<double>> की तरह भी उपयोग करना चाहूंगा। बाद वाले का उपयोग करते समय, मैं चाहूंगा कि foo की परिभाषा इस तरह दिखे

void foo(std::vector<std::complex<float>>& result);

और पसंद नहीं

void foo(std::vector<std::complex<std::complex<float>>>& result);

क्या std::complex<T> मामलों के लिए एक विशिष्ट टेम्पलेट बनाने का कोई तरीका है, जिसमें मैं "आंतरिक" प्रकार तक पहुंच सकता हूं? या यह संभव नहीं है/बुरा अभ्यास? इस मुद्दे को हल करने का सबसे शानदार तरीका क्या है?

9
zimmerrol 28 अक्टूबर 2017, 15:33

2 जवाब

सबसे बढ़िया उत्तर

फ्लोट प्रकार का पता लगाने के लिए एक और तरीका एक प्रकार के लक्षणों के निर्माण से गुजर सकता है (निकालें, जब आवश्यक हो)

template <typename T>
struct getFloatType
 { using type = T; };

template <typename T>
struct getFloatType<std::complex<T>>
 { using type = T; };

और इसे A में प्रयोग करें (देखें fT)

template <typename T>
class A
 {  
   public:
      using fT = typename getFloatType<T>::type;

      void foo(std::vector<std::complex<fT>>& result)
       { }
 };
5
Constructor 28 अक्टूबर 2017, 22:33

आप std::complex की किसी भी तात्कालिकता के लिए आंशिक विशेषज्ञता बना सकते हैं, जैसे

template <typename T>
class A<std::complex<T>>
{  
public:
    void foo(std::vector<std::complex<T>>& result);
};

फिर A<std::complex<double>> के लिए, foo के हस्ताक्षर void foo(std::vector<std::complex<double>>& result); होंगे।

उन डुप्लिकेट कोड को संभालने के लिए, आप एक बेस क्लास बना सकते हैं और आम सदस्यों को इसमें ले जा सकते हैं, और प्राथमिक टेम्पलेट और आंशिक विशेषज्ञता दोनों को इससे प्राप्त कर सकते हैं। जैसे

class Base {
public:
    void bar(...);
};

फिर

template <typename T>
class A : public Base {
    ...
};

template <typename T>
class A<std::complex<T>> : public Base {
    ...
};
1
songyuanyao 30 अक्टूबर 2017, 03:48