如何使用非类型模板参数来传递指向数组的指针?

时间:2018-10-25 19:35:31

标签: c++ templates dynamic-arrays non-type

这段代码是我在动态编程中实现独木舟租赁问题的一部分。

我在堆上动态分配一个二维数组,并将返回的地址保存到指向数组的指针类型的变量中。二维矩阵本身是一个完美的N * N平方。我之所以使用这种非传统的方法,是因为该数组以行优先顺序存储,以便于将其存储到缓存中。

然后,我想将指向数组的指针传递给函数以填充表。我正在使用非类型模板参数,因为我可能正在将指针传递给其他大小的数组。我不知道矩阵的大小是由用户的输入预先确定的。

这是我的代码。我使用int8_t是因为我知道矩阵中的每个值都将是一个<256的数字。

#include <cstdint>   // for uint8_t
#include <cstdlib>   // for size_t, EXIT_SUCCESS
#include <iostream>
#include <vector>

using std::cin;
using std::vector;


template <size_t num_of_stations>
void fillPrices(uint8_t (*&prices)[num_of_stations])
{

}

int main()
{
    size_t num_of_stations = 0;
    cin >> num_of_stations;

    uint8_t (*prices)[num_of_stations] = static_cast<uint8_t(*)[num_of_stations]>( malloc(sizeof(uint8_t[num_of_stations][num_of_stations])) );

    fillPrices(prices);

    delete[] prices;
    prices = nullptr;

    return EXIT_SUCCESS;
}

我收到编译错误。在代码中应进行哪些更改才能使其编译?

canoe_rental.cpp: In function ‘int main()’:
canoe_rental.cpp:32:22: error: no matching function for call to ‘fillPrices(uint8_t (*&)[num_of_stations])’
     fillPrices(prices);
                      ^
canoe_rental.cpp:11:6: note: candidate: template<long unsigned int num_of_stations> void fillPrices(uint8_t (*&)[num_of_stations])
 void fillPrices(uint8_t (*&prices)[num_of_stations])
      ^
canoe_rental.cpp:11:6: note:   template argument deduction/substitution failed:
canoe_rental.cpp:32:22: note:   variable-sized array type ‘long int’ is not a valid template argument
     fillPrices(prices);
                      ^

1 个答案:

答案 0 :(得分:0)

我认为非类型模板参数比它们值得的麻烦更多。因此,我通过将指向数组的指针作为void*传递,还传递了指向数组的元素数量,然后仅使用类型转换来解决了这个问题。现在,在体内,我可以按预期使用数组。有点不优雅,但是行得通!

void fillPrices(void* ptr, size_t num_of_stations)
{
    uint8_t (*prices)[num_of_stations] = static_cast<uint8_t(*)[num_of_stations]>(ptr);

}

// To call the function:
int main() {
    // more code here
    fillPrices(prices, num_of_stations);
}