for_each没有返回(布尔值)值

时间:2018-02-28 12:32:12

标签: c++ c++11

我有一个程序来验证以字符串形式输入的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;

3 个答案:

答案 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)
    {
       // ...
    }
}