2012-02-03 56 views
7

請考慮下面的代碼:C++函數模板特爲已知尺寸typedef操作陣列

#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; 
} 

如果我編譯和運行,我看到:

> 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 

顯然印刷內部funcsizeof指到指針的大小,而不是typedef數組的大小,如main()中給出的。

現在我想知道如何正確地完成讓我的func專注於這樣一種方式,它正確地知道我的typedef和它的大小。

這裏有人能幫助我嗎?

真的很感謝。


EDIT

實現一個專門爲:

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 

我注意到從PcA16_c類型變化。 它有幫助嗎?

+0

你的做法是隻錯誤。您通過引用獲取指針,這會丟失有關數組大小的所有信息。你爲什麼不遵循我和戴維的建議? – 2012-02-03 12:56:20

回答

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

應該是size_t,而不是int? – David 2012-02-03 12:43:53

+2

@Dave:如果你問我,沒關係。 – 2012-02-03 12:44:21

+0

它不......直到你有一個數組int_max <數組大小 David 2012-02-03 12:46:57

1

當作爲右值表達式,數組衰變用來指向第一個元素。您定義的函數需要指針,並執行所期望的操作。如果你想保持陣列,因爲你需要按引用傳遞一個數組,因爲元素的編號是該類型的一部分,您可能希望使用另一個模板參數:

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