簡體   English   中英

已知大小的typedef數組的c ++函數模板專門化

[英]c++ function template specialization for known size typedefed array

請考慮以下代碼:

#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

顯然,在func內部打印的sizeof是指指針的大小,而不是main()給出的typedef數組的大小。

現在,我想知道如何正確地完成使我的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 有幫助嗎?

如果要專門針對數組使用函數,請執行以下操作:

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

當用作右值表達式時,數組會衰減為指向第一個元素的指針。 您定義的函數需要一個指針並執行預期的操作。 如果要將數組維護為數組,則需要通過引用將其傳遞,並且由於元素數量是該類型的一部分,因此您可能希望將其用作另一個模板參數:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM