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并创建自定义运算符,但我不知道这是否可行,如果可行,这似乎有点矫枉过正,或者更糟糕的是,我不知道这是否是一个好的做法,看起来好像没有。
谢谢。
从技术上讲,您需要重载:
// 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“只是算术类型”,那么您就在对域信息撒谎。
| 归档时间: |
|
| 查看次数: |
250 次 |
| 最近记录: |