Шаблон C ++: многомерный массив в качестве входных данных - PullRequest
0 голосов
/ 27 июня 2018

Я пытаюсь реализовать уровень API для проекта C ++, вот небольшой пример того, чего я хочу достичь:

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 голосов
/ 27 июня 2018

При условии, что вы не можете изменить 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]);
}

Демо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...