निम्नलिखित कोड पर विचार करें के लिए समारोह टेम्पलेट विशेषज्ञता: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
जाहिर sizeof
func
अंदर मुद्रित संदर्भित करता है: यदि मैं यह संकलन
#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
के प्रकार परिवर्तन देखा। क्या इससे मदद मिलती है?
आपका दृष्टिकोण बस है गलत। आप संदर्भ द्वारा एक सूचक लेते हैं, जो सरणी आकार के बारे में सारी जानकारी खो देगा। आप मेरे और @ डेविड की सलाह का पालन क्यों नहीं करते? –