gpt4 book ai didi

c++ - 关于C++模板特化和部分模板特化的疑问

转载 作者:行者123 更新时间:2023-11-28 01:03:23 25 4
gpt4 key购买 nike

我正在研究 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()添加了这个模板特化,我认为它应该在我尝试调用时给出了编译错误

PrintBufferString(cInt10Buffer) 通过传递一个带有模板化类型参数 int 的 Buffer 对象,但它编译得很好?那个怎么样?那么为char类型添加这个模板特化有什么用呢?

我想为 char 类型添加一个模板特化,我们不能为任何其他类型调用它

问题 2:然后我在 main 中添加了另一个函数调用,如下所示:

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

PrintBufferString(cChar11Buffer); //

它说这会产生编译错误,但它在 MS -Visual C++ 2010 Express 中编译得很好。它甚至执行得很好并打印出“十”“一些地址”“十一”。

为什么编译和执行都很好?因为我知道类缓冲区的类型不同于类缓冲区,并且功能 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> {
};

请注意(如此处)非特化模板必须在部分特化模板之前。

关于c++ - 关于C++模板特化和部分模板特化的疑问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7667648/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com