从整数模板

时间:2015-09-09 11:21:59

标签: c++ templates

我遇到了模板版_snwprintf_s

来自MSDN

template <size_t size>
int _snwprintf_s(
   wchar_t (&buffer)[size],
   size_t count,
   const wchar_t *format [,
   argument] ... 
); // C++ only

我了解如何使用它,并且我熟悉c ++模板以及使用带整数的模板的可能性。

wchar_t (&buffer)[size]的类型是什么?它是对wchar_t的引用,如果是,那么[size]是什么意思?这叫什么?

我猜测编译器会以某种方式推断出这个大小,但这是我第一次遇到这样的语法并且会理解一个解释,因为我自己也找不到任何东西(可能是因为我不知道该搜索什么。)

另外,如果你可以解释这是如何在场景背后起作用的,那就太棒了。

编辑:

我对编译方式如何工作更感兴趣,而不是传递的类型,如上所述[{3}}

谢谢

2 个答案:

答案 0 :(得分:2)

buffer是对wchar_t[size]类型对象的引用:即对size大小为wchar_t的数组的引用。

这与制作参数wchar_t buffer[]非常相似,但有一些优点:例如它允许你在这里进行模板参数推导,我也看到优化器在某些情况下以这种方式传递数组时表现更好。

答案 1 :(得分:2)

wchar_t (&buffer)[size]是对数组的引用,就像在纯C wchar_t (*buffer)[size]中编写的那样,它是指向数组的指针。

ypu可以将引用视为“常量 - 自动解除引用 - 指针”,并且在99%的时间内它们都是如此实现的。

关键是C ++编译器只能在编译时推断出参数的类型并调用正确的模板函数。

因此, L"hi"将被推断为wchar_t[3]并致电_snwprintf_s<3>

这当然不适用于像wchar_t t* = malloc(3*sizeof(wchar_t));这样的内容,因为它在运行时全部涂层,t的类型为wchar_t*