11

के लिए टेम्पलेट विशेषज्ञता मेरे पास एक विविध टेम्पलेट फ़ंक्शन है जो स्वयं सूची में सबसे बड़ी संख्या निर्धारित करने के लिए कहता है (टेम्पलेटलाइज्ड तर्कों द्वारा गठित)। मैं पैरामीटर पैक खाली होने पर एक विशेषज्ञता बनाने की कोशिश कर रहा हूं, इसलिए मैं सूची के सामने नंबर वापस कर सकता हूं, लेकिन मुझे नहीं पता कि यह कैसे करना है। मैं सिर्फ variadic टेम्पलेट्स और टेम्पलेट विशेषज्ञता के साथ परिचित बनने रहा हूँ, लेकिन यह है कि क्या मैं अब तक है:खाली पैरामीटर पैक

#include <string> 
#include <iostream> 

using namespace std; 

template <int N, int... N2> 
int tmax() { 
    return N > tmax<N2...>() ? N : tmax<N2...>(); 
} 

template <int N> 
int tmax() { 
    return N; 
} 

int main() { 
    cout << tmax<32, 43, 54, 12, 23, 34>(); 
} 

बहरहाल, यह निम्न त्रुटि पैदा करता है:

test.cpp: In function ‘int tmax() [with int N = 34, int ...N2 = {}]’: 
test.cpp:9:45: instantiated from ‘int tmax() [with int N = 23, int ...N2 = {34}]’ 
test.cpp:9:45: instantiated from ‘int tmax() [with int N = 12, int ...N2 = {23, 34}]’ 
test.cpp:9:45: instantiated from ‘int tmax() [with int N = 54, int ...N2 = {12, 23, 34}]’ 
test.cpp:9:45: instantiated from ‘int tmax() [with int N = 43, int ...N2 = {54, 12, 23, 34}]’ 
test.cpp:9:45: instantiated from ‘int tmax() [with int N = 32, int ...N2 = {43, 54, 12, 23, 34}]’ 
test.cpp:18:39: instantiated from here 
test.cpp:9:45: error: no matching function for call to ‘tmax()’ 
test.cpp:9:45: error: no matching function for call to ‘tmax()’ 

मैं भी इस की कोशिश की है, बस देखने के लिए अगर यह काम करेगा (हालांकि यह सूची में नंबर 0 का परिचय बेतरतीब ढंग से इतना है कि यह कभी भी एक संख्या 0 से कम नहीं लौट सकते):

template <int N, int... N2> 
int tmax() { 
    return N > tmax<N2...>() ? N : tmax<N2...>(); 
} 

template <> 
int tmax<>() { 
    return 0; 
} 

हालांकि, त्रुटियों ऊपर उल्लेख के अलावा में, मैं इस त्रुटि मिलती है:

error: template-id ‘tmax<>’ for ‘int tmax()’ does not match any template declaration 

तो मैं इस काम के पाने के लिए क्या करना चाहिए?

मैं -std=c++0x ध्वज के साथ जी ++ 4.5.2 का उपयोग कर रहा हूं।

उत्तर

22

मुझे clang का उपयोग करके दो गलतियां दिखाई देती हैं।

  1. ओवरलोड को पहले एक ही int लेना।

  2. लंबाई की सूचियों के लिए चीजों को स्पष्ट बनाएं 1. याद रखें कि विविधता सूची में शून्य आकार हो सकता है और जब वे ऐसा करते हैं, तो ऐसा लगता है कि आपके पास अस्पष्टता है।

यह संकलित और मेरे लिए सही ढंग से चलाता है:

#include <iostream> 

using namespace std; 

template <int N> 
int tmax() { 
    return N; 
} 

template <int N, int N1, int... N2> 
int tmax() { 
    return N > tmax<N1, N2...>() ? N : tmax<N1, N2...>(); 
} 

int main() { 
    cout << tmax<32, 43, 54, 12, 23, 34>(); 
} 
+1

इष्टतम, धन्यवाद। –

+1

सिर/पूंछ के फैशन में स्पष्ट रूप से "विभाजित" पैरामीटर पैक की आवश्यकता ने मुझे पहले से ही कुछ बार काट दिया है, मुझे उम्मीद है कि हम इसका उपयोग करेंगे ... हालांकि मुझे नहीं लगता कि बेस केस पहले अनिवार्य है , जैसा कि है, मैं आमतौर पर उन्हें तुरंत बाद में डाल दिया। –

0

जब से तुम आंशिक रूप से कार्यों विशेषज्ञ नहीं कर सकते हैं, तो आप अपने कार्यक्षमता रैप करने के लिए की जरूरत है:

template<int Head, int... Tail> 
struct Tmax{ 
    static int do(){ 
    return Head > Tmax<Tail...>::do() ? Head : Tmax<Tail...>::do(); 
    } 
}; 

template<int N> 
struct Tmax<N>{ 
    static int do(){ 
    return N; 
    } 
}; 

template<int... Numbers> 
int tmax(){ 
    return Tmax<Numbers...>::do(); 
} 
+0

यकीन नहीं अगर यह कानूनी है, लेकिन जी ++ - 4.5.1 अपने जवाब की तरह नहीं लगता है: http: // ideone .com/VXqHv मेरे पास मानक की प्रतिलिपि नहीं है, इसलिए यह सुनिश्चित न करें कि यह वास्तविक समस्या है या पुराना कंपाइलर है। – Lambdageek

5

व्यक्तिगत रूप से, मैं बात की इस तरह के लिए कार्यों पर स्थिर वर्ग के सदस्यों का उपयोग कर पसंद करते हैं:

template <int... N> struct max; 
template <int N, int... M> struct max<N, M...> { 
    static const int value = max<N, max<M...>::value>::value; 
};  
template <int N, int M> struct max<N, M> { 
    static const int value = N > M ? N : M; 
}; 

int main() 
{ 
    return max<1,2,3>::value; 
} 

अद्यतन: ildjarn के सुझाव का उपयोग करना, यहां कम वर्बोज़ संस्करण है:

#include <type_traits> 
template <int... N> struct max; 
template <int N, int... M> struct max<N, M...> 
    : std::integral_constant<int, max<N, max<M...>::value>::value> { }; 
template <int N, int M> struct max<N, M> 
    : std::integral_constant<int, (N > M ? N : M)> { }; 
+0

+1, हालांकि व्यक्तिगत रूप से मैं 'value' को मैन्युअल रूप से घोषित करने के बजाय 'std :: integral_constant' से प्राप्त करता हूं। – ildjarn

+0

@ildjarn: धन्यवाद, अपडेट किया गया! चीजों को संक्षिप्त रखने के लिए हमेशा अच्छा :-) –

+0

कैसे: 'टेम्पलेट संरचना अधिकतम \t: integral_constant {}; टेम्पलेट संरचना अधिकतम \t: integral_constant अधिकतम :: मूल्य? ए: अधिकतम :: मूल्य)> {}; ' – sluki

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

  • कोई संबंधित समस्या नहीं^_^