我想确保一个字符串至少有一个alpha。简单:
if ( find_if(field_name.begin(), field_name.end(), isalpha) == field_name.end() )
但我想使用locale
。我知道我可以轻松编写一个单独的函数,但我更喜欢在find_if中使用它。即,
include <locale>
std::locale loc;
if ( find_if(field_name.begin(), field_name.end(), isalpha(*this_iterator,loc) == field_name.end() )
问题:是否有人让this_iterator
引用当时的迭代器?
答案 0 :(得分:7)
在C ++ 11中,你可以像Timo建议的那样使用lambda,或者使用std::bind()
执行此操作,就像在std::bind(isalpha, std::placeholders::_1, loc)
中一样。
Pre-C ++ 11,您可以使用std::bind2nd()
代替。这有点复杂,因为它需要unary_function
或binary_function
作为参数,而不是任何旧的函数对象。我们可以使用std::ptr_fun()
创建一个,但由于某种原因,我们需要明确告诉它模板参数是什么。我们需要使用std::isalpha()
而不是isalpha()
才能获得启用语言环境的版本。所以完整的表达式看起来像
std::bind2nd(std::ptr_fun<char, const std::locale&, bool>(std::isalpha), loc)
毋庸置疑,C ++ 11版本非常简单。
顺便说一句,如果您使用的是C ++ 11,则可以使用std::any_of(...)
代替std::find_if(...) == foo.end()
。它应该表现相同,但稍微更具可读性。
答案 1 :(得分:6)
在C ++ 11中,您可以使用lambda:
if (std::find_if(field_name.begin(), field_name.end(),
[&loc](char c)
{
return isalpha(c, loc);
}) == field_name.end())
{
...
}
在pre-C ++ 11中,您可能必须使用boost :: bind或boost :: lambda来实现相同的功能。
答案 2 :(得分:3)
在C ++ 11之前的版本中,您可以使用覆盖isalpha()
运算符的对象包装()
,然后将其用作谓词,如果您不想使用它std::bind...()
或提升,例如:
#include <locale>
struct isalphaloc
{
const std::locale &_loc;
isalphaloc(const std::locale &loc) : _loc(loc) {}
bool operator(const char c) const
{
return isalpha(c, _loc);
}
};
std::locale loc;
if ( find_if(field_name.begin(), field_name.end(), isalphaloc(loc)) == field_name.end() )