【发布时间】:2012-02-03 12:37:01
【问题描述】:
请考虑以下代码:
#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 及其大小的方式。
这里有人可以帮我吗?
非常感谢。
编辑
将专业化实现为:
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。
有帮助吗?
【问题讨论】:
-
你的方法是错误的。您通过引用获取指针,这将丢失有关数组大小的所有信息。你为什么不听我和@David 的建议?
标签: c++ templates sizeof template-specialization