2012-02-03 12 views
7

निम्नलिखित कोड पर विचार करें के लिए समारोह टेम्पलेट विशेषज्ञता:C++ ज्ञात आकार typedefed सरणी

> g++ -Wall -g3 spec_f_pointer.cpp -o spec_f_pointer 
> ./spec_f_pointer 
Size of char16 = 16 
func: var = 16 bytes chars. [Pc]. 
->  var is ARRAY. Size = 8 

जाहिर sizeoffunc अंदर मुद्रित संदर्भित करता है: यदि मैं यह संकलन

#include <iostream> 
#include <typeinfo> 


template< typename Type > 
void func(Type var) 
{ 
    std::cout << __FUNCTION__ << ": var = " << var << " [" << typeid(var).name() << "]." << std::endl; 
    std::cout << "-> var is SCALAR. Size = " << sizeof(Type) << std::endl; 
} 

#if 1 
template< typename Type > 
void func(Type * var) 
{ 
    std::cout << __FUNCTION__ << ": var = " << var << " [" << typeid(var).name() << "]." << std::endl; 
    std::cout << "-> var is ARRAY. Size = " << sizeof(Type *) << std::endl; 
} 
#endif 

int main() 
{ 
    typedef char char16[ 16 ]; 

    char16 c16 = "16 bytes chars."; 

    std::cout << "Size of char16 = " << sizeof(char16) << std::endl; 

    func(c16); 

    return 0; 
} 

और चलाने के लिए, मैं यह देख main() में दिए गए अनुसार, पॉइंटर के आकार के लिए, और typedef सरणी का आकार नहीं।

अब मुझे आश्चर्य है कि मेरे func को इस तरह से विशेषज्ञ बनाने के लिए सही ढंग से चाल कैसे करें कि यह मेरे टाइपिफ़ और उसके आकार के बारे में सही ढंग से जानता है।

क्या कोई यहां मेरी मदद कर सकता है, कृपया?

वास्तव में धन्यवाद।


संपादित

एक विशेषज्ञता को लागू करने के रूप में:

template< typename Type > 
void func(Type * const &var) 
{ 
    std::cout << __FUNCTION__ << ": var = " << var << " [" << typeid(var).name() << "]." << std::endl; 
    std::cout << "-> var is ARRAY. Size = " << sizeof(Type *) << std::endl; 
} 

उत्पादन होता है:

Size of char16 = 16 
func: var = 16 bytes chars. [A16_c]. 
->  var is SCALAR. Size = 16 

मैं Pc से A16_c के प्रकार परिवर्तन देखा। क्या इससे मदद मिलती है?

+0

आपका दृष्टिकोण बस है गलत। आप संदर्भ द्वारा एक सूचक लेते हैं, जो सरणी आकार के बारे में सारी जानकारी खो देगा। आप मेरे और @ डेविड की सलाह का पालन क्यों नहीं करते? –

उत्तर

12

आप सरणियों के लिए अपने कार्य के विशेषज्ञ चाहते हैं, ऐसा करते हैं:

template<typename T, int N> 
void func(T(&var)[N]) 
{ 
    typedef T Type[N]; 
    std::cout << __FUNCTION__ << " [" << typeid(var).name() << "]." << std::endl; 
    std::cout << "-> var is ARRAY. Size = " << sizeof(Type) << std::endl; 
    std::cout << "Number of elements: " << N << std::endl; 
    std::cout << "Size of each element: " << sizeof(T) << std::endl; 
} 
+0

यह एक आकार_टी होना चाहिए, int नहीं? – David

+2

@ डेव: यदि आप मुझसे पूछें तो वास्तव में कोई फर्क नहीं पड़ता। –

+0

यह नहीं है ... जब तक आपके पास कोई सरणी नहीं है जहां int_max David

1

जब पहला तत्व की ओर इशारा करने के लिए rvalue भाव, सरणियों क्षय के रूप में इस्तेमाल किया। आपके द्वारा परिभाषित किया गया फ़ंक्शन सूचक लेता है और इसकी अपेक्षा की जाती है। आप एक सरणी आप संदर्भ द्वारा इसे पारित करने की जरूरत के रूप में सरणी बनाए रखना चाहते हैं, और आप शायद उपयोग करने के लिए है कि एक और टेम्पलेट तर्क के रूप में चाहते हैं, क्योंकि तत्वों की संख्या प्रकार का हिस्सा है तो:

template <typename T, int N> 
void f(T(&arg)[N]) { 
    cout << sizeof arg << endl; 
}