में तर्क के रूप में पॉलिमॉर्फिक (जेनेरिक) फ़ंक्शंस मैं एक अपेक्षाकृत सरल प्रोग्राम (वास्तव में एक कैलक्यूलेटर) विकसित कर रहा हूं। हालांकि, मैंने अपने कार्यक्रम के सभी घटकों को यथासंभव सामान्य बनाने का निर्णय लिया है क्योंकि:सी ++
- यह अच्छा अभ्यास है।
- यह चीजों को दिलचस्प रखता है।
इस कार्यक्रम के हिस्से के रूप में मैं Tuple
कक्षा का उपयोग कर रहा हूं जिसे मैं लिख रहा हूं। मुझे पता है कि एक वर्ग पहले से मौजूद है, लेकिन मुझे अपने कोड पर पूरा नियंत्रण रखना पसंद है और यह केवल एक अभ्यास है।
एक बात मैं क्या करने की जरूरत एक टपल अभिव्यक्ति 'मूल्यांकनों के परिणाम युक्त में भाव (जहां भाव खुद को सामान्य कर रहे हैं) के एक टपल बदलना है। संक्षेप में, मैं (तुच्छ भागों बाहर छोड़ दिया) के साथ है:
template <class T>
class Expression {
public:
virtual T Eval() = 0;
// ...
};
template <class First, class ... Rest>
class Tuple {
// ...
private:
First first;
Tuple<Rest ...> rest;
};
और मैं इस तरह एक सामान्य प्रकार का एक टपल से अधिक विशेषज्ञ चाहते हैं:
template <template <class> class R, class First, class ... Rest>
class Tuple<R<First>, R<Rest> ...> {
// and here is the problem:
Tuple<First, Rest ...> Transform(function<template<class T> T(R<T>)>);
};
जो बाद मैं ऐसा कर सकता है:
template <class T> // There has to be a better way to do this
T Eval(Expression<T>& expr){
return expr.Eval();
}
// ...
Tuple<First, Rest ...> tuple = exprs.Transform(Eval);
वहाँ कुछ स्थानों पर यहाँ है, जहाँ मुझे यकीन है कि चीजों को और एक असली विशेषज्ञ जो मुझे यहाँ से बाहर मदद कर सकता है की सराहना की होगी के बारे में जाने के लिए कैसे नहीं कर रहा हूँ कर रहे हैं। मुझे उम्मीद है कि यह कोड मामूली खामियों के कारण संकलित नहीं होगा, लेकिन यह बात नहीं है - मेरी प्राथमिक चिंता वह रेखा है जिसे मैंने चिह्नित किया है। यदि मुझे संक्षिप्त अवधि से सही तरीके से याद किया गया है तो मैंने हास्केल सीखा है यह फ़ंक्शन रैंक -2 का होना चाहिए (यदि टिप्पणी नहीं है और मैं टैग हटा दूंगा)। यह सिर्फ सही नहीं दिखता है। क्या इसे करने का कोई तरीका है?
अद्यतन:
मैं एक सामान्य operator()
एक टेम्पलेट तर्क के रूप में के साथ एक functor पारित कोशिश करने की सलाह दी थी, लेकिन है कि या तो काम नहीं किया। की तरह कुछ (here देखें)
'boost :: mpl :: transform' आज़माएं। –
@ एनएम। - वह कार्यक्षमता प्रदान नहीं करता है जिसे मैं ढूंढ रहा हूं। – user2008934
@dyp - हाँ, मैं करता हूं, यह एक शुद्ध वर्चुअल फ़ंक्शन है। लेकिन यह बात नहीं है। मुद्दा यह है कि - मैं एक सामान्य कार्य को तर्क के रूप में कैसे पास करूं? – user2008934