2013-04-11 16 views
5

एक नीति टेम्पलेट टेम्पलेट पैरामीटर और दो नीति परिभाषाओं के माध्यम से सेट के साथ एक टेम्पलेट वर्ग सी पर विचार करें:खाका टेम्पलेट पैरामीटर

template<class T> struct PolicyOne { }; 
template<class T, int U, int V> struct PolicyTwo { }; 
template<class T, template<class> class POLICY> struct C { POLICY<T> policy; }; 

void f() 
{ 
    C<int, PolicyOne> mc1; 
    C<int, PolicyTwo<1, 2> > mc2; // doesn't work this way 
} 

PolicyTwo टेम्पलेट तर्कों की गलत संख्या की वजह से काम नहीं करता। PolicyTwoPOLICY टेम्पलेट पैरामीटर के रूप में उपयोग करने का कोई तरीका है यदि आप अतिरिक्त टेम्पलेट पैरामीटर के लिए प्रकार निर्दिष्ट करते हैं?

मैं सी ++ 03 का उपयोग कर रहा हूं, इसलिए उपनाम घोषणाएं उपलब्ध नहीं हैं। मुझे this question से अवगत है, लेकिन मुझे वहां मेरी समस्या का समाधान नहीं दिख रहा है।

उत्तर

3

कैसे नीति प्रयोग किया जाता है के आधार पर आप उर्फ ​​टेम्पलेट्स के स्थान पर विरासत के साथ प्रबंधन करने में सक्षम हो सकता है:

template<int U, int V> struct PolicyTwoAdaptor { 
    template<class T> struct type: PolicyTwo<T, U, V> { }; }; 
C<int, PolicyTwoAdaptor<1, 2>::type> mc2; 
0

मैं अपने वर्तमान तंत्र के साथ इस को हल करने के hwo नहीं देख सकते हैं, लेकिन आप जिस तरह से यह काम करता है उल्टा कर सकते हैं और यह ठीक संकलन चाहिए (और यहां तक ​​कि वर्ग टेम्पलेट पैरामीटर को हटाने के द्वारा जटिलता को कम कर सकते हैं):

template <typename T> struct PolicyBase { typedef T value_type; }; 
template<class T> struct PolicyOne : public PolicyBase<T> { }; 
template<class T, int U, int V> struct PolicyTwo : public PolicyBase<T> { }; 
template<class POLICY> struct C { POLICY policy; typedef typename POLICY::value_type T; }; 

void f() 
{ 
    C<PolicyOne<int> > mc1; 
    C<PolicyTwo<int, 1, 2> > mc2; // doesn't work this way 
} 

मूलभूत विचार नीति उपयोगकर्ता के प्रकार tempalte पैरामीटर को स्थानांतरित करना है, और इसके बजाय पूरी तरह से तत्काल नीति देना है। फिर पॉलिसी टाइम्सफ़ीफ़ (यदि आवश्यक हो) के माध्यम से पॉलिसी उपयोगकर्ता को अपना टेम्पलेट प्रकार वापस प्रदान करती है।

+0

यह समाधान मेरे लिए काम नहीं करता है क्योंकि यह मुझे एक घोषणा करने के लिए अनुमति नहीं है 'पॉलिसी' के लिए डिफ़ॉल्ट मान जो 'टी' से स्वतंत्र रूप से काम करता है। –

+0

@ गैब्रियल श्राइबर आपकी नीति बस अपने टेम्पलेट प्रकार पैरामीटर को अनदेखा करना चुन सकती है (जबकि इसके प्रकार को अभी भी उजागर कर रही है), और फिर यह 'टी' से स्वतंत्र रूप से काम करती है। –

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