मैं एक विधि (ऑपरेटर(), इस मामले में एक टेम्पलेटेड क्लास D<N>
बना रहा हूं, जो एन के मान के आधार पर विभिन्न प्रकार देता है।कोड डुप्लिकेशन और टेम्पलेट विशेषज्ञता (जब विशेष फ़ंक्शन में अलग-अलग रिटर्न प्रकार होते हैं)
मैं केवल दो अलग-अलग वर्ग घोषणाओं को बनाकर यह काम कर सकता हूं, लेकिन यह बहुत सारे कोड डुप्लिकेशंस की लागत पर आया था। मैं भी में आम सामान फेंकने के लिए एक आम आधार वर्ग बनाने की कोशिश की, लेकिन मैं निर्माता सही वारिस के लिए नहीं मिल सकता है और कैसे मुहावरेदार कि रूप में अच्छी तरह होगा पता नहीं है ...
#include <cstdio>
template <int N>
struct D{
int s;
D(int x):s(x){}
int yell(int x){
printf("N=%d, %d\n", N, s+x);
return s+x;
}
D<N-1> operator()(int x){
D<N-1> d(yell(x));
return d;
}
};
template <>
struct D<1>{
int s;
D(int x): s(x){}
int yell(int x){
printf("N=%d, %d\n", 1, s+x);
return s+x;
}
int operator()(int x){
return yell(x);
}
};
int main()
{
D<2> f(42);
printf("%d\n", f(1)(2));
return 0;
}
कैसे क्या मैं अपना कोड बेहतर दिख सकता हूं?
आप वापसी प्रकार मापदंडों के मूल्य पर निर्भर होने का उपयोगिता पर पुनर्विचार करने की जरूरत है। या तो इसे एक सतत पॉलीमोर्फिक रिटर्न प्रकार बनाएं, या हमेशा एक मूल प्रकार को वापस करने के लिए एक समझदार तरीका पता लगाएं। इस तरह की स्थितियों में मुझे आमतौर पर एप्लिकेशन की मूलभूत आवश्यकताओं पर वापस जाने में मदद मिलती है। – wallyk
समस्या यह है कि एक निश्चित लंबाई की सूचियों को एन्कोड करने के लिए कोई अच्छा प्रकार नहीं है। टेम्पलेट ब्लैक जादू करने से मेरे छोटे डीएसएल का उपयोग करने के लिए अच्छा और टाइप-सुरक्षित भी हो सकता है। – hugomg
तो आपको कुछ "संकलित समय की लंबाई" लिंक-सूची की आवश्यकता है? Std :: array/boost :: array आपके मामले के लिए उपयुक्त नहीं है? नकारात्मकता यह है कि आप इससे "सबएरे" ऑब्जेक्ट नहीं ले सकते हैं लेकिन आप "रनटाइम वैरिएबल लम्बा इंटरफ़ेस" के साथ-साथ (इटरेटर, [], पॉइंटर ...) का उपयोग कर सकते हैं। – ysdx