gpt4 book ai didi

c++ - 消除相似函数定义的重复代码

转载 作者:太空宇宙 更新时间:2023-11-03 10:40:00 25 4
gpt4 key购买 nike

我有一个由一些逻辑 + 底层系统调用组成的方法。现在必须实现另一种方法,它包含完全相似的逻辑,但只有底层系统调用发生变化。

我正在尝试想出一些方法来重用公共(public)代码并实现另一种方法,该方法可能需要一个可调用对象来调用底层系统调用,但自从 read 以来一直没有成功和 recv 调用是不同的。

如果能找到一个类似的优雅解决方案,那就太好了。这些方法看起来像 -


第一个函数

std::string Socket::read(const int bufSize) const
{
auto buffer = std::make_unique<char[]>(bufSize + 1);
auto recvd = 0, count = 0;

std::string str;
str.reserve(bufSize);

do {

// ONLY THIS PART IS DIFFERENT
recvd = ::read(sockfd, buffer.get() + count, bufSize - count);
// ONLY THIS PART IS DIFFERENT

count += recvd;
if (count == bufSize) {
str.append(buffer.get());
str.reserve(str.length() + bufSize);
std::memset(buffer.get(), 0, bufSize);
count = 0;
}
} while (recvd > 0);

str.append(buffer.get(), count);

if (recvd == -1) {
// TODO: Check for recvd == EAGAIN or EWOULDBLOCK and
// don't throw exception in that case.
throw std::runtime_error("Error occurred while writing message");
}

return str;
}

第二个函数

std::string Socket::recv(const int bufSize, SF::recv flags) const
{
auto buffer = std::make_unique<char[]>(bufSize + 1);
auto recvd = 0, count = 0;

std::string str;
str.reserve(bufSize);

do {

// ONLY THIS PART IS DIFFERENT
const auto f = static_cast<int>(flags);
recvd = ::recv(sockfd, buffer.get() + count, bufSize - count, f);
// ONLY THIS PART IS DIFFERENT

count += recvd;
if (count == bufSize) {
str.append(buffer.get());
str.reserve(str.length() + bufSize);
std::memset(buffer.get(), 0, bufSize);
count = 0;
}
} while (recvd > 0);

str.append(buffer.get(), count);

if (recvd == -1) {
// TODO: Check for recvd == EAGAIN or EWOULDBLOCK and
// don't throw exception in that case.
throw std::runtime_error("Error occurred while writing message");
}

return str;
}

最佳答案

当我要比较你的 std::string Socket::read(const int bufSize) conststd::string Socket::recv(const int bufSize) 版本时, SF::recv 标志) const

enter image description here唯一的区别是

const auto f = static_cast<int>(flags);

recvd = ::recv(sockfd, buffer.get() + count, bufSize - count, f);

因此,您的第一个版本可以重构为使用一组特定的 flags 调用第二个版本。

或者您可以为 flags 提供默认值,例如

 std::string Socket::recv(const int bufSize, SF::recv flags = DefaultFlags) const

关于c++ - 消除相似函数定义的重复代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42173402/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com