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