Por favor, considere el siguiente código:C++ especialización de plantilla de función para tamaño conocido gama 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;
}
Si puedo compilar y ejecutar, veo esto:
> 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
Es evidente que el sizeof
impreso dentro func
se refiere al tamaño de un puntero, y no del tamaño de la matriz typedef
, como figura en main()
.
Ahora me pregunto cómo hacer correctamente el truco para hacer que mi func
se especialice de tal manera que conozca correctamente mi typedef y su tamaño.
¿Alguien aquí puede ayudarme, por favor?
Realmente gracias.
EDITAR
La implementación de una especialización como:
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;
}
la salida es:
Size of char16 = 16
func: var = 16 bytes chars. [A16_c].
-> var is SCALAR. Size = 16
I notado el cambio de tipo Pc
-A16_c
. ¿Ayuda?
Su enfoque es solo incorrecto. Toma un puntero por referencia, que perderá toda la información sobre el tamaño de la matriz. ¿Por qué no sigues los consejos de mi y @ David? –