0

次の質問があります。

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

s はライブラリ文字列です。(「cctype」ヘッダーで) isalpha を使用しようとすると、「型が一致しません」と表示されます。問題は、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 に答える
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 に答える