清除任意2D数组

Clear an arbitrary 2D array

本文关键字:数组 2D 任意 清除      更新时间:2023-10-16

我正在研究一些嵌入式代码,我不能使用STL容器。我有几个2D数组,它们的大小在编译时是已知的,我想写一个模板函数来清除它们。然而,我不能让它工作。下面是我的尝试:

template <std::size_t sizeA, std::size_t sizeB>
void clearArray(float a[sizeA][sizeB])
{
    float* begin = &a[0][0];
    std::fill_n(begin, sizeA * sizeB, 0.0);
}
int main()
{
    float f[5][6];
    clearArray(f);
    for (int i = 0; i < 5; ++i)
        for (int j = 0; j < 6; ++j)
            cout << f[i][j] << " ";
}

但是,编译器不能成功地执行参数查找:

test.cpp(22):错误C2784: 'void clearArray(float [sizeA][sizeB])':无法从'float[5][6]'中推断出'float [sizeA][sizeB]'的模板参数'1> test.cpp(13):参见'clearArray'的声明

有办法做到这一点吗?我知道我可以使用sizeof(f)/sizeof(float)来获得元素的数量,或者我可以手动指定维度,但我希望使它尽可能简单。

另外,我在VS2012中测试了这个,但是这个嵌入式系统的编译器不支持c++ 11。

当你将数组传递给函数时,它将衰减为指针(在这种情况下它将变成float (*a)[sizeB],关于大小的信息将丢失,这就是编译器无法推断模板参数的原因。您可以将它从按值传递改为按引用传递,这将保持数组的大小:

template <std::size_t sizeA, std::size_t sizeB>
void clearArray(float (&a)[sizeA][sizeB])
生活