Как найти конструкторы перемещения в кодовой базе, используя grep или IDE?
Я хочу найти конструкторы перемещения в базе кода большого проекта C++. Простое сокращение "&&" не работает, потому что оно соответствует множеству "логических" и "операторов".
Любой способ grep точнее для конструкторов перемещения?
Любой способ поиска конструкторов перемещения с использованием Visual Studio (в Windows) или XCode (в Mac)?
1 ответ
Похоже, работа для регулярных выражений. В Visual Studio нажмите Ctrl + F. Во всплывающем окне поиска активируйте опцию "Использовать регулярные выражения" (или нажмите alt + E, когда строка поиска активна). Затем введите следующее выражение:
\b\w+\s*[\(]\s*(const)*\s*(volatile)*\s*\w+\s*[&][&]\s*[\)]
Он найдет любую строку вида:
class_name(class_name&&)
class_name(const class_name&&)
class_name(volatile class_name&&)
class_name(const volatile class_name&&)
как указано в:
http://en.cppreference.com/w/cpp/language/move_constructor
Выражение также работает, если между именем_класса, круглыми скобками и ключевыми словами, такими как const и т. Д., Есть любое количество пробелов.
Если вы хотите, чтобы он работал и для именованных переменных, например:
class_name(class_name&& variable_name)
достаточно немного его изменить:
\b(\w+)\s*[\(]\s*(const)*\s*(volatile)*\s*\1\s*[&][&]\s*\w*\s*[\)]
РЕДАКТИРОВАТЬ: В ответ на запрос OP, я изменил вышеупомянутое регулярное выражение таким образом, что теперь он использует обратные ссылки. "\1" означает "Найти то же выражение, которое было захвачено первым выражением, сгруппированным в скобках" - первое такое выражение - (\w+), которое является первым "class_name" в приведенных выше примерных конструкторах перемещения. Это гарантирует, что с обеих сторон этого парня будет одинаковая строка: '('. Подводя итог: одна дополнительная пара скобок, '\1' и волшебство происходит.
Интересно, что Microsoft не упоминает, что VS поддерживает обратные ссылки.
Более подробную информацию о регулярных выражениях в Visual Studio можно найти здесь: