2012-02-03 35 views
7

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 

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?

+0

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? –

Trả lời

12

Nếu bạn muốn chuyên chức năng của bạn cho mảng, làm điều này:

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

phải là size_t, không phải là int? – David

+2

@Dave: Không thực sự quan trọng, nếu bạn hỏi tôi. –

+0

Nó không ... cho đến khi bạn có một mảng nơi int_max David

1

Khi sử dụng như biểu rvalue, mảng phân rã để trỏ đến phần tử đầu tiên. Hàm bạn đã xác định có một con trỏ và thực hiện những gì được mong đợi. Nếu bạn muốn duy trì mảng dưới dạng mảng, bạn cần chuyển mảng theo tham chiếu và vì số phần tử là một phần của loại bạn có thể muốn sử dụng làm đối số mẫu khác:

template <typename T, int N> 
void f(T(&arg)[N]) { 
    cout << sizeof arg << endl; 
} 
Các vấn đề liên quan