Я хочу стереть все элементы, которые не удовлетворяют критерию.Например: удалите все символы в строке, которые не являются цифрами.Мое решение с использованием 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 (), однако я все еще думаю, что оператор! является более значимым в моем текущем контексте. Как я могу реализовать такой! like 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;
}
Любая идея, что случилось?
Спасибо,
Чан