【问题标题】:C++ array size inferring from integer template [duplicate]从整数模板推断 C++ 数组大小 [重复]
【发布时间】:2015-09-09 11:21:59
【问题描述】:

我遇到了模板版本_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 (&amp;buffer)[size] 的类型是什么?它是对 wchar_t 的引用吗,如果是,那么 [size] 是什么意思?这叫什么?

我猜编译器会以某种方式推断大小,但这是我第一次遇到这样的语法,希望能得到解释,因为我自己没有找到任何关于它的东西(可能是因为我不知道搜索什么)。

另外,如果你能解释一下这是如何在幕后工作的,那就太好了。

编辑:

我更感兴趣的是它是如何在编译器方面工作的,而不是传递的类型,正如前面提到的 here

谢谢

【问题讨论】:

    标签: c++ templates


    【解决方案1】:

    wchar_t (&amp;buffer)[size] 是对数组的引用,就像您在普通 C 中编写的 wchar_t (*buffer)[size] 一样,它是指向数组的指针。

    ypu 可以将引用视为“常量 - 自动取消引用 - 指针”,并且在 99% 的情况下它们都是这样实现的。

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

    因此, L"hi" 将被推断为 wchar_t[3] 并调用 _snwprintf_s&lt;3&gt;

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

    【讨论】:

      【解决方案2】:

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

      这与制作参数wchar_t buffer[] 非常相似,但也有一些优点:e.g.它可以让您在此处进行模板参数推导,并且我还看到优化器在以这种方式传递数组时在某些情况下表现更好。

      【讨论】:

      • 它也不是指向wchar_t 的指针,与wchar_t buffer[] 不同。所以它不能绑定到这样的指针。
      • 答案读起来很好,我正要投赞成票,直到我读到这个 ​​"这与制作参数 wchar_t buffer[] 非常相似" .
      猜你喜欢
      • 1970-01-01
      • 2011-06-27
      • 2014-10-16
      • 1970-01-01
      • 2013-04-24
      • 2012-06-07
      • 1970-01-01
      • 2014-12-24
      • 2022-12-02
      相关资源
      最近更新 更多