清除任意2D数组

rlb*_*ond 4 c++ templates

我正在研究一些我无法使用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] << " ";
}
Run Code Online (Sandbox Code Playgroud)

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

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

有没有办法做到这一点?我知道我可以sizeof(f)/sizeof(float)用来获取元素的数量,或者我可以手动指定尺寸,但我希望尽可能简单.

此外,我在VS2012中对此进行了测试,但此嵌入式系统的编译器不支持C++ 11.

son*_*yao 8

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

template <std::size_t sizeA, std::size_t sizeB>
void clearArray(float (&a)[sizeA][sizeB])
Run Code Online (Sandbox Code Playgroud)

生活