2012-02-03 19 views
7

perche il codice seguente:C++ modello di funzione specializzazione per dimensione nota dell'array 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; 
} 

Se compilo e eseguire, vedo questo:

> 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 

Chiaramente il sizeof stampato all'interno func riferisce alla dimensione di un puntatore e non alle dimensioni dell'array typedef, come indicato in main().

ora mi chiedo come fare correttamente il trucco per ottenere il mio func di specializzarsi in un modo tale che conosce in modo corretto sulla mia typedef e la sua dimensione.

Qualcuno qui può aiutarmi, per favore?

Davvero grazie.


EDIT

implementazione di una specializzazione:

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

L'uscita è:

Size of char16 = 16 
func: var = 16 bytes chars. [A16_c]. 
->  var is SCALAR. Size = 16 

ho notato il cambiamento tipo a Pc a A16_c. Aiuta?

+0

Il tuo approccio è solo sbagliato. Si prende un puntatore per riferimento, che perderà tutte le informazioni sulla dimensione dell'array. Perché non segui il consiglio di @ e @ David? –

risposta

12

Se si desidera specializzarsi la funzione per gli array, fare questo:

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

dovrebbe essere un size_t, non un int? – David

+2

@Dave: non importa, se me lo chiedi. –

+0

Non ... finché non si dispone di un array dove int_max David

1

Quando viene utilizzato come espressioni rvalue, array di decadimento per puntatori al primo elemento. La funzione che hai definito prende un puntatore e fa ciò che è previsto. Se vuoi mantenere l'array come array devi passarlo per riferimento e poiché il numero di elementi è parte del tipo probabilmente lo vuoi usare come altro argomento template:

Problemi correlati