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

标签 c++ networking refactoring c++14 code-reuse

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

我正在尝试想出一些方法来重用公共(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/

相关文章:

c++ - 未知的 C++ 对象实例化语法

java - 在 Java 7 中获取正确的 mac 地址

networking - 究竟什么时候创建网络数据包?

swift - 重构开关语句

java - 如何修复基于 Java 的项目的特性嫉妒?

c++ - 是否可以从std::string继承以提供类型一致性?

c++ - boost 与标准原子顺序一致性语义

c++ - 运行我的 C++ 代码给我一个空白的控制台

windows - netsh 并阻止访问除一个 WLAN 以外的所有 WLAN

java - 如何将所有包名称重命名为小写