Тест относительно прост. Я тестирую какой -то объект "iobuffer". Существует функция recv , которая используется для копирования данных из сокета в буфере. Эта функция recv принимает необязательный указатель функции, который можно использовать для переключения между вызовом хорошо известной функции OS recv или макета.
Код: Выделить всё
#include
#include
#include
#include
#include
#include
struct Buffer {
explicit Buffer(const std::size_t capacity)
: p_write{nullptr}
, capacity_{capacity}
, p_data{std::make_unique(capacity)}
{
p_write = p_data.get();
}
auto write_span() const noexcept {
return std::span(p_write, p_data.get() + capacity_);
}
void update_write(const size_t n) noexcept {
p_write += n;
}
uint8_t* p_write;
const std::size_t capacity_;
const std::unique_ptr p_data;
};
// same signiture as `::recv`
using RecvFunction = ssize_t(*)(int, void*, size_t, int);
ssize_t recv(
int sock_fd,
Buffer &buffer,
int flags,
RecvFunction f = ::recv
) {
auto span = buffer.write_span();
const ssize_t recv_size = f(sock_fd, span.data(), span.size(), flags);
buffer.update_write(recv_size);
return recv_size;
}
int main() {
// test case
{
Buffer buffer(1024);
const int fake_fd = 2;
const auto lambda = [](int fg, void* buf, size_t n, int flags) -> ssize_t {
constexpr char LINE[] = "EXAMPLE_DATA";
const std::size_t length = strlen(LINE);
const auto n_min = std::min(length, n);
std::memcpy(buf, LINE, n_min);
return n_min;
};
const auto byte_count = recv(fake_fd, buffer, 0, lambda);
constexpr char LINE[] = "EXAMPLE_DATA";
if (byte_count != strlen(LINE)) {
std::println("TEST FAIL");
std::println("byte_count={}, strlen={}", byte_count, strlen(LINE));
}
else {
std::println("TEST OK");
}
}
return 0;
}
Проблема в том, что Constexpr char line [] повторяется дважды. Это происходит первым в теле функции Lambda. Затем это происходит вне тела лямбды, где он используется для расчета ожидаемого количества скопированных байтов. < /P>
Я попробовал несколько вещей, чтобы попытаться обойти это. Это не работает, потому что лямбда может быть преобразована в регулярный указатель функции только в том случае, если он не захватывает. Это тоже не сработало. Я думаю, что это слишком сложно, обеспечивая небольшую пользу, чтобы объяснить здесь, поэтому я не включил код для него. По сути, эта идея не удалась. То, что шаблонный подход имел некоторые проблемы: < /p>
Трудно понять код (он становится очень запутанным относительно того, что происходит, почти нечитаемо) и трудно понять ошибки компилятора, когда что -то не работает. Более сложный и нечитаемый с каждым модульным тестом, потому что тестовый код нуждается в новой функции «введена» в него для использования в качестве параметра шаблона. Вот почему я пытался избежать использования шаблона.
Есть ли какое -то другое решение, которое можно использовать для решения этого?>
Подробнее здесь: https://stackoverflow.com/questions/797 ... n-argument
Мобильная версия