【问题标题】:Mysterious oneliner template code, any one? [duplicate]神秘的oneliner模板代码,有吗? [复制]
【发布时间】:2009-07-24 18:34:00
【问题描述】:

我正在阅读此页面: C++ Tip: How To Get Array Length。作者提供了一段代码来了解静态数组的大小。

template<typename T, int size>
int GetArrLength(T(&)[size]){return size;} // what does '(&)' mean ?
.
.
.
int arr[17];
int arrSize = GetArrLength(arr); // arrSize = 17

谁能解释一下这段代码,因为我不明白它是如何工作的。

【问题讨论】:

    标签: c++ arrays templates metaprogramming


    【解决方案1】:

    函数将引用 (&amp;) 传递给类型为 T 且大小为 size 的数组。

    【讨论】:

    • 对不起,我不明白为什么我们要传递一个数组的引用? :)
    • 因为这样它不会复制数组以将其传递给函数。
    • @Goz 数组在传递时不会在 C/C++ 中复制,数组的名称是引用。我错了吗?
    • @AraK:该数组确实会作为指针传递。代码只是明确地说明了这一点。这是不必要的优化。
    • 将数组传递给函数的唯一方法是作为引用。数组不能按值传递。如果您尝试,它会衰减为指针。而如果函数接收到一个指针,则数组大小信息已经丢失。使函数可见大小信息的唯一方法是传递对数组的引用。
    【解决方案2】:

    sizeof(x)/sizeof(x[0])

    如果数组降级为指针类型,则不会捕获错误,但仍会编译!

    模板版本是防弹的。

    【讨论】:

      【解决方案3】:

      T(&)[size] 是对 T[size] 的引用。如果不使用引用,C++会将T[size]视为T*,函数模板参数推导不起作用。

      【讨论】:

        【解决方案4】:

        哇,这很棘手。我也不知道,但是如果您继续阅读该页面上的 cmets:

        本质上是

        int arr[17]; int arrSize = GetArrLength(arr);

        它创建了这个函数:

        int GetArrLength(int(&)[17]){return 17;}

        所以 & 必须像往常一样表示引用,所以它引用数组类型,大小(模板中的第二项)就是传入数组的大小。

        我想我会坚持旧的

        sizeof(x)/sizeof(x[0])
        

        【讨论】:

        • 你的 sizeof 技巧的问题是,如果数组衰减到一个指针,它会默默地失败。然后你得到错误的结果,但没有错误或警告。如果传递指针,OP 显示的模板技巧将无法编译。
        • 我同意 Jaif 的观点(注意:+1):使用引用数组技巧是提取数组大小的正确方法。这就是 Visual C++ 实现其 C++ strcpy_s(和类似)函数的方式。 sizeof 将在 C++ 上静默失败。
        猜你喜欢
        • 2012-11-10
        • 1970-01-01
        • 1970-01-01
        • 2015-04-28
        • 2013-07-17
        • 1970-01-01
        • 2021-12-11
        • 1970-01-01
        • 2019-07-05
        相关资源
        最近更新 更多