Функция замены строки с новой строкой Lazy-Evaliced, от значения или функтораC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Функция замены строки с новой строкой Lazy-Evaliced, от значения или функтора

Сообщение Anonymous »

Я ищу довольно универсальную функцию шаблона, которая заменяет все входы поисковой строки в данном строковом объекте на текстовый текст с ленивым оцениваемым, возможно, называя функтор. символ в строке? есть: < /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 , также должно работать в качестве аргумента для нового текста замены. Особенно текст, поступающий из ленивого оцениваемого функционального. И можно использовать также в других классах, которые предоставляют необходимые функции в их интерфейсе.

Код: Выделить всё

std::string
Например). So it needs to extend the lifetime of this temporary (or copy the value, but this seems inefficient and should be avoided)

[*]The new (replace) string parameter should only be evaluated once, even when several replacements occur (at least in case the replace parameter is a functor).

The function should be Оптимизирован также для случая, где замена не происходит. То есть он не должен создавать дорогие временные объекты (например, временный std :: string ), если они впоследствии не используются. (Причина: мой вариант использования состоит из очень большого количества вызовов для функции разыскиваемой замены, с лишь несколькими реальными замены.) < /P>
< /li>
Я хочу единую функцию в одном. Ревизии могут помочь другим. (Поэтому я не добавляю тег VS2022.)

Код: Выделить всё

auto& replace_all(auto& string, auto search, auto replace)
< /code>
Тогда вот пример кода для проверки функции: < /p>
std::string t = "hello world";
replace_all(t, "hello", []() { return "Hello"; });
replace_all(t, std::string("Hello"), "HELLO");
replace_all(t, "world", std::string("World"));
replace_all(t, "World", []() { return std::string("WORLD"); });
replace_all(t, "WORLD", []() { return "sunshine"; });
replace_all(t, std::string("HELLO"), []() { return "good day"; });
replace_all(t, "&", []() -> std::string { return (const char*)0; });  //never evaluated!
assert(t == "good day sunshine");
Примечание:
Я перенес свое исследование - мое собственное решение (которое не соответствует всем требованиям) с улучшениями от Pepijn Kramer и Igor Tandetnik - на ответ, но я ищу лучшую, состоящую только из одной функции, если возможно.>

Подробнее здесь: https://stackoverflow.com/questions/797 ... -or-a-func
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»