重载operator+以增加boost::asio::ip上的IP地址

Vin*_*rão 5 c++ boost operator-overloading boost-asio

我想对来自 的 IP 地址进行数学运算boost::asio。具体来说,我需要在现有地址上增加和/或添加给定的整数,以简化我正在编写的软件中的 IP 列表生成。

就像今天一样,我使用自定义类来处理 IP 地址和网络,但我想转向boost::asio这样我就可以依靠它们来正确检查/验证地址和网络属性。

我有这个工作代码作为示例(除了该operator+部分):

using boost::asio::ip::make_address_v4;
using boost::asio::ip::address_v4;

auto add(const address_v4& address, std::size_t value = 1) {
    return make_address_v4(address.to_uint() + value);
}

// This is definitely wrong
auto operator+(std::size_t value, const address_v4& address) {
    return add(address, value);
}

int main() {
    auto ip1 = make_address_v4("192.168.1.1");
    fmt::print("IP address: {}\n", ip1.to_string());

    auto ip2 = make_address_v4(ip1.to_uint() + 1);
    fmt::print("IP address: {}\n", ip2.to_string());

    // Add function
    fmt::print("Added IP: {}\n", add(ip2, 8).to_string());
    fmt::print("Added IP: {}\n", add(ip2).to_string());

    // operator+
    fmt::print("Added IP: {}\n", (ip2 + 4).to_string());

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

add函数按预期工作,但我不知道如何重载它,以便我可以执行以下操作:ip++ip + 4

还有更好的数学方法吗boost::asio::ip::address_v4?我总是uint在那里获取值并进行数学计算。

我正在考虑的另一个解决方案是继承boost::asio::ip::address_v4并创建自定义运算符,但我不知道这是否可行,如果可行,这似乎有点矫枉过正,或者更糟糕的是,我不知道这是否是一个好的做法,看起来好像没有。

谢谢。

seh*_*ehe 1

从技术上讲,您需要重载:

// This is morally wrong
auto operator+(const address_v4& address, std::size_t value) {
    return add(address, value);
}
Run Code Online (Sandbox Code Playgroud)

这是因为左侧操作数是address_v4,而不是size_t

现场演示

但是,请不要这样做。请参见例如运算符重载的基本规则和习惯用法是什么?。这里的操作没有明确且无可争议的含义。有很大的惊喜空间。根据子网划分,增加地址可以使常规地址变成广播地址,甚至可以跨入不同的子网。

例如,"10.10.9.254" + 0x01010101 == 11.11.10.255没有什么意义,甚至"255.255.255.255" + 0x01010101 == "1.1.1.0"更没有意义。

您可能想要的是一个子网感知的枚举器/迭代器接口,如果您需要非顺序遍历,甚至可能需要随机采样。如果您将其抽象为address_v4“只是算术类型”,那么您就在对域信息撒谎。