специализация шаблона функции c ++ для массива с определенным размером

Пожалуйста, рассмотрите следующий код:

#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

Очевидно, чтоsizeof напечатано внутриfunc относится к размеру указателя, а не к размеру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, Это помогает?

Ответы на вопрос(2)

Ваш ответ на вопрос