我正在处理一些无法使用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] << " ";
}

但是,编译器无法成功执行参数查找:



有没有办法做到这一点?我知道我可以使用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])

LIVE

08-16 07:59