簡體   English   中英

有關C ++模板專業化和部分模板專業化的查詢

[英]Query about C++ template specialization and partial template specialization

我正在研究C ++概念-模板專業化和部分模板專業化。 擁有下面要理解的代碼,以便正確理解這些概念。

關於這一點,我有幾個問題,請在下面的內聯中進行提問:

template <typename T, int nSize>
class Buffer
{
private:   
    T m_atBuffer[nSize];

public:
    T* GetBuffer()
    {
        return m_atBuffer;
    }

    T& operator[](int nIndex)
    {
        return m_atBuffer[nIndex];
    }
};


template <typename T, int nSize>
void PrintBufferString(Buffer<T, nSize> &rcBuf)
{
    std::cout << rcBuf.GetBuffer() << std::endl;
}


void PrintBufferString(Buffer<char, 10> &rcBuf)
{
    std::cout << rcBuf.GetBuffer() << std::endl;
}


int main()
{
    // declare a char buffer
    Buffer<char, 13> cChar10Buffer;

    // copy a value into the buffer
    strcpy(cChar10Buffer.GetBuffer(), "Ten");

    PrintBufferString(cChar10Buffer); //This prints "Ten"

    // declare an int buffer
    Buffer<int, 10> cInt10Buffer;

    // copy values into the buffer
    for (int nCount=0; nCount < 10; nCount++)
        cInt10Buffer[nCount] = nCount;

    PrintBufferString(cInt10Buffer); // This prints address of the buffer- m_atBuffer for object cInt10Buffer

    return 0;
}

因此,如果我們將除char以外的任何其他類型傳遞給模板化函數PrintBufferString(),它會打印出緩沖區的地址而不是字符串,這是一個問題。

因此,為了解決這個問題,它說我們定義了一個模板專門化,如下所示,以確保只能將char類型的數組傳遞給PrintBufferString()

void PrintBufferString(Buffer<char, 10> &rcBuf)
{
    std::cout << rcBuf.GetBuffer() << std::endl;

}

問題1:因此,為函數PrintBufferString()添加了此模板專業化功能,我認為當我嘗試調用它時應該給出編譯錯誤

通過傳遞帶有模板化類型參數int的Buffer對象,從而實現PrintBufferString(cInt10Buffer),但編譯良好嗎? 那個怎么樣? 那么為char類型添加此模板專用化有什么用?

我以為為char類型添加模板專業化,我們不能為其他任何類型調用它

問題2:然后我在main中添加了另一個函數調用,如下所示:

Buffer<char, 11> cChar11Buffer;
strcpy(cChar11Buffer.GetBuffer(), "Eleven");

PrintBufferString(cChar11Buffer); //

它說這會產生編譯錯誤,但在MS -Visual C ++ 2010 Express.IT中編譯良好,甚至可以正常執行並打印“十”,“某些地址”,“十一”。

為什么編譯並執行得很好? 因為我知道類緩沖區的類型不同於類緩沖區,並且函數PrintBufferString()接受類類型為Buffer的對象,而這兩個對象不能混在一起?

問題3:然后繼續定義如下的部分模板特殊化,以處理以下情況:可以傳遞char類型但大小不限的對象緩沖區,然后將Class對象類型傳遞給函數PrintBufferString();

template<int nSize>
void PrintBufferString(Buffer<char, nSize> &rcBuf)
{
    std::cout << rcBuf.GetBuffer() << std::endl;
}

現在它也像以前一樣打印“十”“十一”。 那么,部分模板專業化實現了什么特殊功能? 這不是部分模板專業化的好例子嗎? 從這個例子中,這個概念對我來說不是很清楚。

C ++沒有/支持功能模板的部分專業化,僅支持類模板。 因此,您正在查看的代碼與您(至少說您)想要學習/理解的內容都不相關。

部分專門的類模板將是這樣的:

template <class T, class U>  // the "base" (unspecialized) template
class X { 
};

template <class T>            // partial specialization for `X<whatever, int>`
class X<int> {
};

請注意(如此處所示),非專用模板必須位於部分專用模板之前。

在您的第一種情況下,該函數不是專門化的,只是重載。

如果要防止使用char類型以外的其他類型,只需定義問題3的版本即可。只要不使用template <>作為函數的前綴,就不會將其視為部分專業化。

您可以定義使用帶有某些固定template參數的模板類型的函數。

暫無
暫無

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

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