我想用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
只是一个算术类型你的域名信息是在撒谎。