重载操作符+以增加boost::asio:: IP上的IP地址



我想用boost::asio的IP地址做数学运算。具体来说,我需要在现有地址上增加和/或添加一个给定的整数,以简化我正在编写的软件中的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;
}

add函数按预期工作,但我不知道如何重载它,所以我可以这样做:ip++ip + 4

也有一个更好的方法来做数学与boost::asio::ip::address_v4?我总是得到uint的值,并在那里做数学运算。

我想的另一个解决方案是继承boost::asio::ip::address_v4并创建自定义操作符,但我不知道这是否会起作用,如果它起作用,这似乎是多余的,或者更糟的是,我不知道这是否是一个好的做法,它看起来不像。

谢谢。

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

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

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

现场演示

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

"10.10.9.254" + 0x01010101 == 11.11.10.255没有意义,"255.255.255.255" + 0x01010101 == "1.1.1.0"更没有意义。

您可能需要的是一个子网感知的枚举器/迭代器接口,如果需要非顺序遍历,甚至可以使用随机抽样。如果你把它抽象出来就好像address_v4只是一个算术类型你的域名信息是在撒谎。

相关内容

最新更新