Спасибо за ваше предложение, и я на самом деле проверил источник boost :: is_digit. Тем не менее, это было намного сложнее, чем я могу себе представить. Поэтому я ищу более простое решение в этом случае.

у стереть все элементы, которые не удовлетворяют критерию. Например: удалите все символы в строке, которые не являются цифрами. Мое решение с использованием boost :: is_digit сработало хорошо.

struct my_is_digit {
 bool operator()( char c ) const {
  return c >= '0' && c <= '9';
 }
};

int main() {
 string s( "1a2b3c4d" );
 s.erase( remove_if( s.begin(), s.end(), !boost::is_digit() ), s.end() );
 s.erase( remove_if( s.begin(), s.end(), !my_is_digit() ), s.end() );
 cout << s << endl; 
 return 0;
}

Затем я попробовал свою собственную версию, компилятор пожаловался :( ошибка C2675: унарный '!': 'My_is_digit' не определяет этот оператор или преобразование в тип, приемлемый для предопределенного оператора

Я мог бы использовать адаптер not1 (), однако я все еще думаю, что оператор! более значимым в моем текущем контексте. Как я мог реализовать такое! как boost :: is_digit ()? Любая идея?

Обновить

Следуйте инструкциям Чарльза Бейли, я получил этот фрагмент кода, но на выходе ничего не получилось:

struct my_is_digit : std::unary_function<bool, char> {
    bool operator()( char c ) const {
        return isdigit( c );
    }
};

std::unary_negate<my_is_digit> operator !( const my_is_digit& rhs ) {
    return std::not1( rhs );
}

int main() {
    string s( "1a2b3c4d" );
    //s.erase( remove_if( s.begin(), s.end(), !boost::is_digit() ), s.end() );
    s.erase( remove_if( s.begin(), s.end(), !my_is_digit() ), s.end() );
    cout << s << endl;  
    return 0;
}

Есть идеи, что случилось?

Спасибо,
Chan

Ответы на вопрос(0)

Ваш ответ на вопрос