2016-05-22 8 views
6

मैं एक टेम्पलेट पैरामीटर एक टेम्पलेट स्वीकार करना चाहता हूं जिसमें संख्यात्मक टेम्पलेट तर्क हो।टेम्पलेट टेम्पलेट पैरामीटर कैसे एक संख्यात्मक मान लेते हैं?

यह उदाहरण शायद ज्यादा सरल बनाया है, लेकिन मैं कुछ इस तरह करना चाहते हैं:

template <int X> 
struct XX 
{ 
    static const int x = X; 
}; 

template<typename TT, TT V, template<V> TX> 
void fnx(TX<V> x) 
{ 
    static_assert(V == TX::x, "IMPOSSIBLE!"); 
} 

void fny() 
{ 
    fnx(XX<1>()) 
} 

मैं इस वाक्य विन्यास को समझ नहीं किया जाना चाहिए, के रूप में यह संभव होना चाहिए। मैं इसे कैसे पूरा करूं?

+2

क्या 'TT' माना जाता है? 'fn'' में 'fnx' को कॉल करते समय संकलक अपने प्रकार को कैसे कम करेगा? क्या आप अपनी समस्या का अधिक संदर्भ दे सकते हैं, आप इस दृष्टिकोण के साथ हल करने की कोशिश कर रहे हैं? –

+0

@ m.s। संभवतः 'int'। – Barry

+0

संवैधानिक रूप से आपको 'टेम्पलेट क्लास TX' की आवश्यकता है। लेकिन यह पूरी समस्या नहीं है। –

उत्तर

6

बस अपने वाक्य रचना थोड़ा फिक्सिंग - के बाद से टेम्पलेट टेम्पलेट पैरामीटर को अनुचित तरीके से निर्दिष्ट किया जाता है, तो हम कुछ इस तरह को रखना होगा:

template <typename T, template <T > class Z, T Value> 
//     ^^^^^^^^^^^^^^^^^^^^^ 
void foo(Z<Value> x) { } 

हालांकि, संकलक T यहाँ अनुमान नहीं कर सकते हैं - यह है एक गैर-कटौती संदर्भ। आपको इसे स्पष्ट रूप से प्रदान करना होगा:

foo<int>(XX<1>{}); 

यह बहुत परेशान है। मैं एक प्रकार की विशेषता भी लिख नहीं सकता हूं जैसे कि non_type_t<XX<1>>int है (जहां उस प्रकार का विशेषता प्रकार पर वास्तविक आत्मनिरीक्षण करता है, ऐसा कुछ नहीं जो छोटे से int देता है)।


इस प्रक्रिया (P0127) गैर प्रकार टेम्पलेट तर्कों की गैर निष्कर्ष निकाला संदर्भ सत्ता में संशोधन से सुधारने के लिए प्रस्ताव है।

+0

ओलु में मतदान के लिए 'टेम्पलेट ' प्रस्ताव की तरह लगता है। – chris

+0

@ क्रिसिस येप, इसे मिला। – Barry

+0

आह, हाँ। पैरामीटर प्रकार एक प्रकार है, मान नहीं। धन्यवाद। हालांकि ऑटो कटौती विफलता के बारे में बहुत बुरा है। :( – Adrian

2

fnx की आपकी घोषणा कुछ काम की ज़रूरत है, और TT टाइप साइट पर कटौती नहीं की जा सकती है।

template<typename TT, TT V, template<TT> class TX> 
void fnx(TX<V> x) 
{ 
    static_assert(V == TX<V>::x, "IMPOSSIBLE!"); 
} 

void fny() 
{ 
    fnx<int>(XX<1>()); 
} 

कार्य उदाहरण: https://ideone.com/57PsCA

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