Шаблоны должны использоваться в заголовках, потому что компилятор должен создавать экземпляры разных версий кода в зависимости от параметров, заданных / выведенных для параметров шаблона. Помните, что шаблон не представляет собой код напрямую, а шаблон для нескольких версий этого кода. Когда вы компилируете функцию non-template в файле .cpp
, вы компилируете конкретную функцию / класс. Это не относится к шаблонам, которые могут быть созданы с использованием разных типов, а именно, если при замене параметров шаблона конкретными типами необходимо исправить конкретный код.
Была функция с ключевым словом export
, которая была предназначенный для отдельной компиляции. Функция export
устарела в C++11
и, AFAIK, только один компилятор реализовал ее. Вы не должны использовать export
. Отдельная компиляция невозможна в C++
или C++11
, но, возможно, в C++17
, если понятия в нее входят, мы могли бы иметь некоторый способ отдельной компиляции.
Для отдельной компиляции, которая должна быть достигнута, разделить проверка шаблона тела должна быть возможна. Кажется, что решение возможно с концепциями. Взгляните на этот документ , недавно представленный на совещании по стандартам. Я думаю, что это не единственное требование, поскольку вам все равно необходимо создать код кода шаблона в коде пользователя.
Отдельная проблема компиляции для шаблонов, я думаю, это также проблема, возникающая при миграции на модули, которые в настоящее время работают.
Вы можете попробовать: \ sBlah \ s
.
Или, если вы разрешите начало и конец привязки, (^ | \ s) Blah (\ s | $)
Это будет соответствовать "Blah"
отдельно или каждому Blah
в «Blah and Blah»
\ s
означает «пробел персонаж". ^
соответствует позиции перед первым символом в строке $
соответствует позиции сразу после последнего символа в строке Если вы хотите сопоставить оба Бла
в «Бла-Бла»
, то, поскольку один пробел «разделяется» между двумя вхождениями, вы должны использовать утверждения. Примерно так:
(^|\s)Blah(?=\s|$)
Бла
Вышеупомянутое регулярное выражение также будет соответствовать начальному пробелу.
Если вы хотите только Бла
, в идеале было бы неплохо заглянуть назад:
(?<=^|\s)Blah(?=\s|$)
Но поскольку Javascript не поддерживает его, вы можете вместо этого написать:
(?:^|\s)(Blah)(?=\s|$)
Теперь Бла
будет записан в \ 1
без начальных пробелов.
Попробуйте \ sBlah \ s
- это будет соответствовать любой форме пробелов с обеих сторон.
(^|\s)Blah(\s|$)
должно сработать, однако оно также выделит пробелы, если вам нужно только слово, вы можете сделать следующее:
(^|\s)(Blah)(\s|$)
и возьмите группу 2 ($2 в ruby).
Если вам нужна помощь с RegEx, посмотрите: http://www.gskinner.com/RegExr/