[英]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.