Спасибо за ваше предложение, и я на самом деле проверил источник 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