Вариадическая функция с рекурсией - PullRequest
0 голосов
/ 12 сентября 2018

Я пытаюсь написать рекурсивную функцию с переменными параметрами для копирования моих данных.Но эта функция копирует только последний параметр.Что я делаю не так?

Это вывод:

13 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

12 0 0 0 0 0 0 0 0 0 0 0 

С уважением.

#include <iostream>
#include <cstdint>
#include <cstring>
using namespace std;

void copy_data(unsigned char* ar, unsigned& offset, int data) {
    std::memcpy(ar + offset, (void*)&data, sizeof(data));
    offset += sizeof(data);
}

template<class... Args>
void copy_data(unsigned char* ar, unsigned& offset, int data, Args... args) {
    if ((sizeof...(Args)) == 0) {
        copy_data(ar, offset, data);
    }
    copy_data(ar, offset, args...);
}

void printf_data(const unsigned char* ar, int s) {
    for (int i = 0; i < s; ++i) {
        std::cout << (int)ar[i] << " ";
    }
    std::cout<<"\n";
}

int main() {
    unsigned char *arr0 = new unsigned char[16];
    unsigned char *arr1 = new unsigned char[12];

    int p0 = 10;
    int p1 = 11;
    int p2 = 12;
    int p3 = 13;

    unsigned offset = 0;

    copy_data(arr0, offset, p0, p1, p2, p3);

    offset = 0;
    copy_data(arr1, offset, p0, p1, p2);

    printf_data(arr0, 16);
    printf_data(arr1, 12);

    delete [] arr1;
    delete [] arr0;
    return 0;
}

ОБНОВЛЕНИЕ: исправлена ​​функция

template <typename T>
void copy_data(unsigned char* ar, unsigned& offset, T data) {
    std::memcpy(ar + offset, (void*)&data, sizeof(data));
    offset += sizeof(data);
}

template <typename T, typename... Args>
void copy_data(unsigned char* ar, unsigned& offset, T data, Args... args) {
    copy_data(ar, offset, data);
    copy_data(ar, offset, args...);
}

1 Ответ

0 голосов
/ 12 сентября 2018

Рекурсия выводит только что-либо, когда:

if ((sizeof...(Args))==0) {
    copy_data(ar, offset, data);
}

, и это происходит только после удаления каждого аргумента, кроме последнего отключения.

Удаляет предложение if.

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