Специализация шаблона функции 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 () .

Теперь мне интересно как правильно сделать фокус, чтобы моя функция специализировалась таким образом, чтобы она правильно знала о моем 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 . Это помогает?

8
задан j4x 3 February 2012 в 12:53
поделиться