我有一个由一些逻辑 + 底层系统调用组成的方法。现在必须实现另一种方法,它包含完全相似的逻辑,但只有底层系统调用发生变化。
我正在尝试想出一些方法来重用公共(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) const
和 std::string Socket::recv(const int bufSize) 版本时, SF::recv 标志) const
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/