C ++模板:多维数组作为输入

时间:2018-06-26 21:08:42

标签: c++ arrays templates multidimensional-array

我正在尝试为C ++项目实现API层,这是我想要实现的一个小例子:

double data[8] = {0,1,2,3,4,5,6,7};

template<typename T>
void cpy(T *buf){
    for(int i=0; i<8; i++)
        buf[i] = (T)data[i];
}

int main() {
    int a[8];
    cpy(a);

    float b[8];
    cpy(b);

    double c[2][4]; 
    cpy(c); //error: functional cast to array type 'double [4]'

    return 0;
}

想法是允许用户将函数cpy()用于不同类型的数组,而不必执行cpy<double>(c)cpy((double *)c),但在此示例中,调用cpy()二维数组会导致编译错误:

error: expected initializer before 'cpy'
 In instantiation of 'void cpy(T*) [with T = double [4]]':
  required from here
error: functional cast to array type 'double [4]'

我们如何实现这一目标?

1 个答案:

答案 0 :(得分:2)

假设您无法更改main()(除了缺少;的错字)。 您可以添加重载:

template<typename T>
void cpy(T *buf){
    for (int i = 0; i != 8; ++i) {
        buf[i] = data[i];
    }
}

template<typename T, std::size_t N>
void cpy(T (*buf)[N]){
    cpy(&buf[0][0]);
}

Demo