0

我有以下问题:

find_if(s.begin(), s.end(), isalpha);

s 是一个库字符串。当我尝试使用 isalpha (在“cctype”标题中)时,它说“类型不匹配”。问题是 isalpha 接受一个 int 并返回一个 int: int isalpha(int)

我通过声明另一个函数来解决它:

bool IsAlpha(char c) {
  return isalpha(c);
}

但是,有没有更好的方法来做到这一点?我希望代码更清晰和简单,而不声明这个“包装器”函数。

谢谢!

4

4 回答 4

2

我想“正确”的 C++ 方法是使用isalpha在语言环境中定义的:

std::find_if(
    s.begin(), 
    s.end(), 
    [](char c) { return std::isalpha(c, std::locale()); }
);

可能有点冗长。

于 2013-04-11T06:17:26.017 回答
1

我能想象的唯一方法是,你使用using namespace std, 因为你写了find_if,而不是std::find_if,在这种情况下,你有以下错误 Live example。您不应该编写包装器,您可以简单地使用::isalpha Live 示例,或者您可以将第二个 par 绑定到默认语言环境,就像这里

于 2013-04-11T06:24:07.660 回答
0

您的解决方案对我来说看起来不错。除了它有一个非常常见的错误

bool IsAlpha(char c) {
  return isalpha(c);
}

应该

bool IsAlpha(char c) {
  return isalpha((unsigned char)c);
}

isalpha 仅针对 unsigned char 值(通常为 0 到 255)和 EOF(通常为 -1)定义。严格来说,将任何其他负值传递给 isalpha 是未定义的。然而,在实践中你会发现(假设你的 char 类型是有符号的)如果你给你的例程提供代码 255 的字符,你最终会将 -1 的值传递给 isalpha,它总是返回 false。

于 2013-04-11T05:57:24.323 回答
0

如何使用函子?

    struct IsAlpha {
      bool operator() (char c) const { return /* isAlpha logic here */; }         
    };
    //... 
    find_if(begin, end, IsAlpha());

在此处查看使用带有 stl 算法的函子的优势

于 2013-04-11T06:00:10.593 回答