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

j4x*_*j4x 8 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;
}
Run Code Online (Sandbox Code Playgroud)

如果我编译并运行,我会看到:

> 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
Run Code Online (Sandbox Code Playgroud)

显然,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;
}
Run Code Online (Sandbox Code Playgroud)

输出是:

Size of char16 = 16
func: var = 16 bytes chars. [A16_c].
->      var is SCALAR. Size = 16
Run Code Online (Sandbox Code Playgroud)

我注意到从类型的变化PcA16_c.有帮助吗?

Arm*_*yan 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;
}
Run Code Online (Sandbox Code Playgroud)

  • @fljx:您不强制用户传递任何内容.T和N都将自动推断出来.这是一种非常优雅的方法! (3认同)
  • @Dave:如果你问我,那真的不重要. (2认同)