c++ - 清除任意二维数组

标签 c++ templates

我正在处理一些无法使用 STL 容器的嵌入式代码。我有几个二维数组,其大小在编译时已知,并且想编写一个模板函数来清除它们。但是,我无法让它工作。这是我尝试过的:

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): error C2784: 'void clearArray(float [sizeA][sizeB])' : could not deduce template argument for 'float [sizeA][sizeB]' from 'float [5][6]' 1> test.cpp(13) : see declaration of '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])

LIVE

关于c++ - 清除任意二维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32017049/

相关文章:

c++ - 是否有 C++ 或 Qt 库可用于测量应用程序的功能使用情况

c++ - Qt Creator - UI 类的自定义命名空间

c++ - 为什么这种替代失败发生在基于 SFINAE 的反射中?

c++ - 如何为 boost::units::si::angular_acceleration 赋值?

c++ - 从数字数组中删除重复项

c++11 可变参数编程,如何定义 vector 塔

c++ - 我可以在类之外定义私有(private)模板函数吗?

C++ 未定义对使用模板的类的引用

javascript - 在运行时初始化 HTML 模板图像属性

c++ - 如何推断 CRTP 中的类型?