3

文字列に少なくとも 1 つのアルファがあることを確認したい。単純:

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当時のイテレータを参照する方法はありますか?

4

3 に答える 3

7

std::bind()C++11 では、Timo が提案するようにラムダを使用して、または のように を使用してこれを行うことができますstd::bind(isalpha, std::placeholders::_1, loc)

Pre-C++11、代わりに使用できますstd::bind2nd()unary_functionただし、古い関数オブジェクトの代わりにorbinary_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()。同じように動作するはずですが、少し読みやすくなっています。

于 2012-12-13T00:32:25.267 に答える
6

C++11 では、ラムダを使用できます。

if (std::find_if(field_name.begin(), field_name.end(),
                 [&loc](char c)
                 {
                   return isalpha(c, loc);
                 }) == field_name.end())
{
  ...
}

C++11 より前のバージョンでは、おそらく boost::bind や boost::lambda などを使用して同じ機能を実現する必要があります。

于 2012-12-13T00:31:02.147 に答える
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() )
于 2012-12-13T00:39:45.943 に答える