Я ищу (своего рода универсальный швейцарский армейский нож), которая заменяет все вхождения строки поиска в данном строковом объекте с помощью текста замены, возможно, оцениваемого ленивым. есть: < /p>
Строка, которую нужно манипулировать, а также строку поиска, не требует быть конкретного типа, такого как std :: string < /code>. It's sufficient to be string-like.
The new text parameter, used to replace the search string, may be a value or a functor that will be invoked to deliver a value
The new text is only evaluated, when the search string is found
The new text is only evaluated once, even when it is used multiple times (in case it occurs more than once in the string to манипулировать) Он должен быть только конвертируется в std :: string_view , совместимый с строкой, которая будет манипулировать. Это означает, что char*, std :: string_view , std :: string , char*(*) () и std :: function все в порядке.
Вот требования, которые делают эту функцию очень универсальной и очень отличающейся от ответов. />
Функция должна принимать все возможные виды типов текстов (
, std :: string_view , std :: string , char*(*) () , std :: function , ...) для нового текста (заменить). Все, что оценивается на что -то, что присваивается для std :: basic_string_view , также должно работать в качестве аргумента для нового текста замены. Особенно текст, поступающий из ленивого оцениваемого функционального. И можно использовать также в других классах, которые предоставляют необходимые функции в их интерфейсе.
Например). Таким образом, ему необходимо продлить срок службы этого временного (или копировать значение, но это кажется неэффективным и следует избегать) < /p>
< /li>
Новый (заменивший) струнный параметр должен оцениваться только один раз, даже если возникает несколько замен (по крайней мере, в случае, если параметр замены является functor). Оптимизирован также для случая, где замена не происходит. То есть он не должен создавать дорогие временные объекты (например, временный std :: string ), если они впоследствии не используются. (Причина: мой вариант использования состоит из очень большого количества вызовов для функции разыскиваемой замены, с лишь несколькими реальными замены.) < /P>
< /li>
Я хочу единую функцию в одном. Ревизии могут помочь другим. (Итак, я не добавляю тег VS2022.)
Примечание:
Я добавил свое собственное решение (которое я сейчас не доволен) как ответ, но я ищу лучшее, если возможно.>
Я ищу (своего рода универсальный швейцарский армейский нож), которая заменяет все вхождения строки поиска в данном строковом объекте с помощью текста замены, возможно, оцениваемого ленивым. есть: < /p> [list] [*] Строка, которую нужно манипулировать, а также строку поиска, не требует быть конкретного типа, такого как std :: string < /code>. It's sufficient to be string-like. [*]The new text parameter, used to replace the search string, may be a value or a functor that will be invoked to deliver a value [*]The new text is only evaluated, when the search string is found [*]The new text is only evaluated once, even when it is used multiple times (in case it occurs more than once in the string to манипулировать) Он должен быть только конвертируется в std :: string_view , совместимый с строкой, которая будет манипулировать. Это означает, что char*, std :: string_view , std :: string , char*(*) () и std :: function все в порядке. [/list] Вот требования, которые делают эту функцию очень универсальной и очень отличающейся от ответов. /> [list] [*] Функция должна принимать все возможные виды типов текстов ([code]char*[/code], std :: string_view , std :: string , char*(*) () , std :: function , ...) для нового текста (заменить). Все, что оценивается на что -то, что присваивается для std :: basic_string_view , также должно работать в качестве аргумента для нового текста замены. Особенно текст, поступающий из ленивого оцениваемого функционального. И можно использовать также в других классах, которые предоставляют необходимые функции в их интерфейсе.[code]std::string[/code] Например). Таким образом, ему необходимо продлить срок службы этого временного (или копировать значение, но это кажется неэффективным и следует избегать) < /p> < /li> Новый (заменивший) струнный параметр должен оцениваться только один раз, даже если возникает несколько замен (по крайней мере, в случае, если параметр замены является functor). Оптимизирован также для случая, где замена не происходит. То есть он не должен создавать дорогие временные объекты (например, временный std :: string ), если они впоследствии не используются. (Причина: мой вариант использования состоит из очень большого количества вызовов для функции разыскиваемой замены, с лишь несколькими реальными замены.) < /P> < /li> Я хочу единую функцию в одном. Ревизии могут помочь другим. (Итак, я не добавляю тег VS2022.)
[/list] [b] Примечание: [/b] Я добавил свое собственное решение (которое я сейчас не доволен) как ответ, но я ищу лучшее, если возможно.>