c++ - 数组大小推导

标签 c++ arrays c++11 templates stl

按照斯科特·迈耶(Scott Meyer)的“现代C++”中的一个示例,我将利用模板来减少std::array的大小。我偶然尝试编译myUsage函数用法。

#include <array>
#include <iostream>

template <typename T, std::size_t N>
constexpr std::size_t arraySize(T (&) [N]) noexcept
{
        return N;
}

void scottUsage()
{
        int b[5];
        std::array<short, arraySize(b)> c;
        std::cout << arraySize(b) << " = " << c.size() << "\n";
}

template <typename T, std::size_t N>
void myUsage(T & arr [N])
{
        for (auto i=0; i<arraySize(arr); i++)
                std::cout << arr[i] << "\t";
}

int main()
{
        scottUsage();

        int a[7];
        myUsage(a);
}


因此出现两个问题:
  • (附带问题)(&)的作用是什么?删除会触发error: creating array of references,似乎是禁止的
  • myUsage签名出了什么问题?
  • 最佳答案

    myUsage()需要使用T (&arr) [N]

    template <typename T, std::size_t N>
    void myUsage(T (&arr) [N])
    

    括号告诉编译器该引用适用于数组本身,而不适用于数组的元素类型。

    另外,arraySize()myUsage()都应引用const数据:

    template <typename T, std::size_t N>
    constexpr std::size_t arraySize(const T (&) [N]) noexcept
    ...
    template <typename T, std::size_t N>
    void myUsage(const T (&arr) [N])
    

    顺便说一句,从C++ 17开始不需要arraySize(),请改用 std::size() :

    #include <array>
    #include <iostream>
    #include <iterator>
    
    void scottUsage()
    {
        int b[5];
        std::array<short, std::size(b)> c;
        std::cout << std::size(b) << " = " << c.size() << "\n";
    }
    
    template <typename T, std::size_t N>
    void myUsage(const T (&arr) [N])
    {
        for (auto i = 0; i < std::size(arr); ++i)
            std::cout << arr[i] << "\t";
        /* better:
        for (const T &value : arr)
            std::cout << value << "\t";
        */
    }
    
    int main()
    {
        scottUsage();
        int a[7];
        myUsage(a);
    }
    

    关于c++ - 数组大小推导,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59559688/

    相关文章:

    javascript - Array.prototype.sort() 在某些情况下有效,而在其他情况下则无效

    c++ - 计算一个数的长度

    c++ - MFC:您可以更改 CDateTimeCtrl 中的旋转加速度吗?

    c++ - 使用 struct 插入 std::map 失败并出现构造函数错误

    c++ - 覆盖代理类 c++ 的 std::swap

    c++ - 如何重载继承类中的方法,以便基类看到继承的版本?

    c++ - 不允许将强类型枚举用作相同基础类型的参数?

    c++ - lambda 函数 c++ 按值捕获重置其值,为什么?

    arrays - 二维数组上的 numpy Logical.xor

    arrays - 如何在一个巨大的数字列表中定位两个数字,其中 xi=xj?