Hãy xem xét đoạn mã sau:C++ chức năng mẫu chuyên môn cho kích thước được biết đến mảng typedefed
#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;
}
Nếu tôi biên dịch và chạy, tôi thấy điều này:
> 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
rõ sizeof
in bên func
đề cập với kích thước của một con trỏ, và không phải là kích thước của mảng typedef
, như được đưa ra trong main()
.
Bây giờ tôi tự hỏi làm thế nào để thực hiện một cách chính xác thủ thuật để nhận được func
để chuyên về cách thức mà nó biết chính xác về typedef của tôi và kích thước của nó.
Có ai ở đây có thể giúp tôi không?
Thực sự cảm ơn.
EDIT
Thực hiện một chuyên môn hóa như:
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;
}
Đầu ra là:
Size of char16 = 16
func: var = 16 bytes chars. [A16_c].
-> var is SCALAR. Size = 16
tôi nhận thấy sự thay đổi kiểu Pc
-A16_c
. Ứng dụng có trợ giúp không?
Cách tiếp cận của bạn sai rồi. Bạn lấy một con trỏ bằng cách tham chiếu, sẽ mất tất cả thông tin về kích thước mảng. Tại sao bạn không theo lời khuyên của tôi và @ David? –