这一计划将编译

来源:互联网 发布:网络三大邪书 编辑:程序博客网 时间:2024/06/02 07:08
这将使我们能够做到以下几点
123456789101112int main(){    // declare a char buffer    Buffer<char, 10> cChar10Buffer;     // copy a value into the buffer    strcpy(cChar10Buffer.GetBuffer(), "Ten");     // Print the value    PrintBufferString(cChar10Buffer);    return 0;}

得到以下结果

虽然这项工作,它有一个设计上的缺陷。考虑下面的

2345678910111213int main(){    // declare an int buffer    Buffer<int, 10> cInt10Buffer;     // copy values into the buffer    for (int nCount=0; nCount < 10; nCount++)        cInt10Buffer[nCount] = nCount;     // Print the value?    PrintBufferString(cInt10Buffer); // what does this mean?    return 0;}

这一计划将编译执行产生以下(或类似的)

0012ff10

出什么事了?printbufferstring() std::cout具有打印rcbuf价值。getbuffer(),它返回一个指针m_atbuffer!当数据类型是一个字符法院将打印数组作为一个C风格字符串当数据类型是字符(如在这种情况下)将打印cout持有地址指针

显然,本案暴露了滥用此功能(书面)。没有明确地检查代码,程序员将没有任何线索,这个函数不正确处理非字符缓冲区。可能会导致程序错误

模板特化

解决这个问题的一个看似有用的方法是使用模板特化确保只有类型为char数组可以通过printbufferstring()。当你在以前的教训模板特化允许你定义一个函数所有的模板类型已经解决一个特定的数据类型

这里的一个例子,如何在这里工作


0 0
原创粉丝点击