2015-01-27 2 views
0

Мне интересно, почему стандарт C++ решил создать функции regex_ * (regex_match, regex_search, regex_replace), не являющийся членом. Для выполнения алгоритмов все они должны получить доступ к функциям basic_regex. Почему они не делают их функциями-членами basic_regex? Каковы преимущества бесплатных функций в этом случае?Почему стандарт C++ упрощает выполнение алгоритмов регулярных выражений?

+3

Кто сказал, что они не являются «друзьями»? Не было бы подходящего способа для кода пользователя, чтобы определить, являются ли они 'friend'. Почему они должны быть функциями-членами 'basic_regex'? –

+2

[Как функции, отличные от членов, улучшают инкапсуляцию] (http://www.drdobbs.com/cpp/how-non-member-functions-improve-encapsu/184401197) – Praetorian

+6

Стандарт C++ не решал, дизайн пришел из Boost.Regex почти не изменился. Обоснование проекта находится по адресу http://www.open-std.org/jtc1/sc22/WG21/docs/papers/2003/n1429.htm#algorithm_discussion –

ответ

1

Поскольку функции regex_ * не являются членами, не являющимися друзьями, они имеют доступ только к общему интерфейсу basic_regex. Если им нужен только доступ к публичному интерфейсу, то в функции-члене нет свободной функции, поскольку члены и свободные функции могут получить доступ к общему интерфейсу. Кроме того, будучи свободными функциями, вы удаляете зависимости, которые связывают функции regex_ * с классом basic_regex. Если функции regex_ * добавлены или изменены или удалены, пользователи basic_regex, которые не используют эти конкретные функции regex_ *, не должны перекомпилировать или бить ресницы. Это поможет будущим доказательствам клиентов этих функций и basic_regex для любых изменений, которые придуманы в будущих стандартах.

Функции regex_ * должны быть функциями-членами или функциями друга, только если им нужен доступ к защищенным или закрытым членам интерфейса basic_regex.

Зачем нужна добавленная зависимость, если она не нужна?

+0

-1: Они, вероятно, являются 'friend's - нет способа определить код пользователя, если они есть или нет, и стандарт не указывает. –

+0

достаточно справедливо, но даже в качестве 'друга' все еще есть немного больше свободы, используя свободные функции над функциями-членами. Класс 'basic_regex' больше не зависит от функций. – YoungJohn

+0

Я не думаю, что вы можете реализовать эти функции regex_ *, используя только открытый интерфейс basic_regex. Но если они «друг», то для чего нужны функции-члены? Я не вижу никаких преимуществ, связанных с тем, чтобы они «дружили» над членами. – Cranky