2012-02-03 13 views
7

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?

+0

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

Respuesta

12

Si desea especializarse su función para las matrices, haga lo siguiente:

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

debería ser un size_t, no un int? – David

+2

@Dave: Realmente no importa, si me preguntas. –

+0

No tiene ... hasta que tenga una matriz donde int_max David

1

Cuando se utiliza como expresiones rvalue, caries arrays de punteros al primer elemento. La función que ha definido toma un puntero y hace lo que se espera. Si desea mantener la matriz como una matriz, debe pasarla por referencia, y dado que la cantidad de elementos es parte del tipo, probablemente desee utilizarlo como otro argumento de plantilla:

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