我有一个程序来验证以字符串形式输入的IPv4地址是否为有效的点分四位表示法。
我面临的问题是,一旦检测到错误,我就无法返回(退出)功能。根据cppreference文档for_each返回UnaryFunction。我尝试使用any_of和all_of,但是他们要求我在我的lambda函数中使用一个循环(基于范围的循环),我试图避免。我错过了什么或者无法在for_each中返回值。
vector<string> ipExplode;
string ip;
bool inValidIp = false;
cout << "Server IP : ";
cin >> ip;
trim(ip);
ipExplode = explode(ip, '.');
if(not for_each(ipExplode.begin(), ipExplode.end(), [](const string& str) -> bool{
int32_t ipNum;
if(regex_search(str, regex("\\D+")))
return false;
try
{
ipNum = stoi(str);
if(ipNum < 0 or ipNum > 255)
return false;
}
catch (std::exception& ex)
{
return false;
}
}))
return false;
答案 0 :(得分:8)
来自for_each
:
如果f返回结果,则忽略结果。
即。从for_each
lambda返回一个值没有意义。
这里一个不错的选择是all_of
,它接受UnaryPredicate
而不是UnaryFunction
,因为您要确保所有部分字符串成功传递lambda:
bool isValid = std::all_of(ipExplode.begin(), ipExplode.end(), [](const std::string& str) -> bool{
if(regex_search(str, regex("\\D+")))
return false;
try
{
int32_t ipNum = stoi(str);
if(ipNum < 0 or ipNum > 255)
return false;
}
catch (std::exception& ex)
{
return false;
}
return true;
});
all_of
将在找到无效部分后停止迭代。
答案 1 :(得分:1)
我错过了什么或者无法在for_each中返回值。
for_each
会返回UnaryFunction
。但是如果你把一元函数放到if
表达式上,那就毫无意义了。
在您的情况下,没有捕获的lambda可以隐式转换为函数指针。非空函数指针作为布尔值始终为true
。因此你的
if(not for_each( /* ... */ ))
将始终评估为false
。
正如评论员和其他回答者已经写过的那样,std::all_of
就是你想要的。
答案 2 :(得分:1)
无论如何,你不应该使用for_each
。用基于范围的替换它,它变得如此简单和优雅。把它全部放在一个函数中然后你去:
auto is_ip_valid(const std::vector<std::string>& ipExplode)
{
for (auto&& str : ipExplode)
{
// ...
}
}