मैं वर्तमान में टेम्प्लेट के साथ संघर्ष कर रहा हूं: मेरे पास एक टेम्प्लेटेड क्लास 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>
मामलों के लिए एक विशिष्ट टेम्पलेट बनाने का कोई तरीका है, जिसमें मैं "आंतरिक" प्रकार तक पहुंच सकता हूं? या यह संभव नहीं है/बुरा अभ्यास? इस मुद्दे को हल करने का सबसे शानदार तरीका क्या है?
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)
{ }
};
आप 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 {
...
};
संबंधित सवाल
जुड़े हुए प्रश्न
नए सवाल
c++
C ++ एक सामान्य-प्रयोजन प्रोग्रामिंग भाषा है। यह मूल रूप से C के विस्तार के रूप में डिज़ाइन किया गया था और इसमें एक समान सिंटैक्स है, लेकिन यह अब पूरी तरह से अलग भाषा है। C ++ कंपाइलर के साथ संकलित कोड के बारे में प्रश्नों के लिए इस टैग का उपयोग करें। विशिष्ट मानक संशोधन [C ++ 11], [C ++ 14], [C ++ 17], [C ++ 20] या [C ++ 23], आदि से संबंधित प्रश्नों के लिए संस्करण-विशिष्ट टैग का उपयोग करें। ।