- Строка, которую нужно манипулировать, а также строку поиска, не требует быть конкретного типа, такого как 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 все в порядке.
[*] Функция должна принимать все возможные виды типов текстов (
Код: Выделить всё
char*Код: Выделить всё
std::string[*]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
Мобильная версия