В настоящее время я работаю над проектом на С++, который должен иметь как можно меньше внешних зависимостей, и поэтому я в значительной степени придерживаюсь STL и Boost. До сих пор я почти исключительно жил в Qt-land, когда речь зашла о С++. В общем, я стараюсь использовать С# и Python, когда могу.
Сегодня я хотел проверить, содержит ли std::vector
определенный элемент. С Qt я сделал бы это так:
QList< int > list;
list.append( 1 );
list.append( 2 );
list.append( 3 );
if ( list.contains( 2 ) )
{
// do something
}
Хороший и читаемый. Но std::vector
не имеет метода contains
, что было неожиданностью. Хорошо... что будет для STL-идиомы для чего-то подобного? Поиск вокруг, похоже, таков:
std::vector< int > list;
list.push_back( 1 );
list.push_back( 2 );
list.push_back( 3 );
std::vector< int >::const_iterator result =
std::find( list.begin(), list.end(), 2 );
if ( result != list.end() )
{
// do something
}
Это (для меня) мало читаемо и слишком многословно. Поэтому я обнаружил, что пишу функцию полезности, которая принимает вектор и значение и возвращает bool
в зависимости от того, было ли это значение найдено или нет. В принципе, шаблонный метод contains()
; обертка для вышеуказанного вызова std::find
. Затем я могу использовать это способом, аналогичным примеру Qt.
У меня есть несколько аналогичных функций полезности, которые могли бы обернуть другие идиомы STL ни по какой другой причине, а (воспринимаемое) увеличение удобочитаемости. То, что я хочу знать, это... это плохая идея? Другие люди делают то же самое? Я пропустил что-то важное? Код будет OSS в какой-то момент, и я бы предпочел не делать что-то особенное, что другие разработчики С++ бывали странными.