【问题标题】:A function in the LLVM source that calculates array length [duplicate]LLVM源中计算数组长度的函数[重复]
【发布时间】:2014-04-30 04:10:10
【问题描述】:

llvm-3.4\include\llvm\ADT\STLExtras.h,我看到了这个函数:

/// Find the length of an array.
template<class T, std::size_t N>
inline size_t array_lengthof(T (&)[N]) {
  return N;
}

此函数返回数组长度:

int main(){
  const char spaces[] = "dededesdf sdf sdfs fdsf"
                        "dadsds jsdfdfs ffjsdklfj dsfds";
  std::cout << array_lengthof(spaces); //prints 54
  return 0;
}

有人能解释一下这个函数是如何工作的以及参数T (&amp;)[N]是什么意思吗? 是否存在此功能不起作用的场景?

【问题讨论】:

    标签: c++ arrays templates function-templates


    【解决方案1】:

    这是一个非类型模板参数。它通过利用模板参数推导机制来工作。基本上,它会尝试找出会导致匹配的模板参数。

    只要它是一个真正的数组,它就可以工作。它不适用于指向一块内存的指针,例如:

    int *array = new int[10];
    array_lengthof(array); // ERROR.
    

    【讨论】:

      【解决方案2】:

      array_lengthof 是一个模板函数。该函数是在编译时为所有数组类型和大小的组合(您在代码中传递给该函数)在编译时生成的。

      所以如果你调用这个函数为 int a[10]; 函数调用将被编译器隐式转换为

      array_lengthof<int, 10>(a).
      

      参数 T (&param)[N] 表示 param 是对大小为 N 的 int 数组的引用。(N 是编译时间常数)

      【讨论】:

        猜你喜欢
        • 2014-06-04
        • 1970-01-01
        • 1970-01-01
        • 2021-05-26
        • 2010-11-10
        • 2013-02-18
        • 1970-01-01
        • 2013-03-01
        相关资源
        最近更新 更多