Функция замены строки с новой строкой 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
Например). Таким образом, ему необходимо продлить срок службы этого временного (или копировать значение, но это кажется неэффективным и следует избегать) < /p>
< /li>
Новый (заменивший) струнный параметр должен оцениваться только один раз, даже если возникает несколько замен (по крайней мере, в случае, если параметр замены является functor). Оптимизирован также для случая, где замена не происходит. То есть он не должен создавать дорогие временные объекты (например, временный std :: string ), если они впоследствии не используются. (Причина: мой вариант использования состоит из очень большого количества вызовов для функции разыскиваемой замены, с лишь несколькими реальными замены.) Ревизии могут помочь другим (поэтому я не добавляю тег VS2022) < /p>
< /li>
< /ul>
Функция может иметь прототип, подобный этому: < /p>

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

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++»