請考慮下面的代碼: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
顯然印刷內部func
的sizeof
指到指針的大小,而不是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
我注意到從Pc
到A16_c
類型變化。 它有幫助嗎?
你的做法是隻錯誤。您通過引用獲取指針,這會丟失有關數組大小的所有信息。你爲什麼不遵循我和戴維的建議? – 2012-02-03 12:56:20