返回首页

最近,我帮助别人调试围绕} {A0一个问题,如果我需要格式化成一个字符串。 我认为,微软的这些方法的安全版本,即那些_s后缀了缓冲区的大小,以便寻找我wasnbsp swprintf_s帮助时; momentarilynbsp的,缺乏一个缓冲参数大骇。 不过,我则注意到,swprintf_s不只是一个普通的功能,但实际上是一个函数模板:模板LT;大小ţsizegt;
INT swprintf_s(
NBSP wchar_t的(AMP缓冲)[尺寸],
NBSP 常量wchar_t的*格式,参数...);只/ / c 一个函数模板最有用的特性之一是它的能力,以推断其参数类型。 在这种情况下的说法是不是一个类型参数,但一个基本类型(虽然使用的为size_t的typedef)指定的目标字符串缓冲区的大小(以字符而不是字节)。使用时为:wchar_t的BUF [10]
swprintf_s(buf中,"%D",10); 它推导出大小的缓冲区(BUF)是10。 这工作,因为模板参数是用来指定的预期的wchar_t数组swprintf_f预计的大小。 NBSP,它可能已被指定为在swprintf_slt; 10GT;(buf中,"%D,10),但这个美丽的地方是在于,编译器能够推断它NBSP。这是函数模板做什么,以及他们如何"经常被使用,所以没有什么新颖这里找到一个数组的大小NBSP接受应用程序。这是一个真正的绝招,我不知道为什么我已经错过了这么久

这里很重要的一点是,签名是一个数组的引用(注意放前缓冲区),反对的只是wchar_t的(缓冲)[尺寸]的数组语法。如果这个使用函数模板将无法推断参数(尺寸)。这是因为语法:templatelt为size_t sizegt;美孚(wchar_t的(缓冲)[尺寸]){A}成为:templatelt;为size_t sizegt美孚(wchar_t的缓冲区); 例如,foo()编译时,可以接受一个任意大小的wchar_t数组的指针。事实上,为wchar_t *指针是罚款。有对此都没什么特别的,它只是标准衰变的C和C一贯支持。总之,回归后,轻微转移到衰变让推断数组的大小。那么,为什么这是有用的吗?为了遍历任何数组的元素,例如:诠释一个[] = {0,1,2,3,4};(I = 0;我LT; sizeof(a)项的/如sizeof(int); I)
SomeFn(I)或略好:A [] = {0,1,2,3,4}
的std :: for_each的(放大器; [0],放大器; [sizeof(a)项的/如sizeof(int),放大器; SomeFn)元素的数量要求,以终止迭代。获得任何类型的数组的大小可以是广义概念,即templatelt; typename的T,为size_t sizeOfArraygt; INT GetNmberOfElements的(T(下放大器;) [sizeOfArray])
{
返回sizeOfArray;
} 它可以用来改写前面的例子:A [] = {0,1,2,3,4}
的std :: for_each的(AMP; [0],&A [GetNumberOfElements(一)],放大器; SomeFn); 选举有关衰变的讨论应该指出的是,这个机制只对实际阵列。 用于防止蛀牙,即使用"放";签名意味着不能传递一个指针,例如:字符* PA =新的char [100];
GetNumberOfElementslt;字符型,100gt;(PA);

回答