已知大小typedefed数组的c ++函数模板特化

时间:2012-02-03 12:37:02

标签: c++ templates sizeof template-specialization

请考虑以下代码:

#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 个答案:

答案 0 :(得分:13)

如果您想专门针对数组使用函数,请执行以下操作:

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

答案 1 :(得分:2)

当用作右值表达式时,数组会衰减为指向第一个元素的指针。您定义的函数采用指针并执行预期的操作。如果要将数组维护为数组,则需要通过引用传递它,并且因为元素的数量是您可能希望将其用作另一个模板参数的类型的一部分:

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