Код: Выделить всё
char*Параметр строки сменной строки должен оцениваться только один раз (по крайней мере, в случае, если это функтор). < /p>
< /li>
Функция должна быть оптимизирована также для случая, когда не происходит замены. То есть он не должен создавать дорогие временные объекты (например, временную строку), если они впоследствии не используются. (Причина: мой вариант использования состоит из очень большого количества вызовов в функцию замены только с несколькими фактическими заменами.) (Поэтому я не добавляю тег VS2022.)
Код: Выделить всё
using String = std::wstring;
template
requires std::is_assignable_v ||
std::is_assignable_v
String& replace_all(String& string, std::xstring_view _search, Replace replaceExpr)
{
using string_view = std::basic_string_view;
string_view search(_search);
if(!search.empty())
{
String replaceStr; bool replaceStrSet = false;
for(size_t pos = 0; (pos = string.find(search, pos)) != String::npos; pos += replaceStr.size())
{
if(!replaceStrSet)
{
if constexpr(std::is_invocable_r::value)
replaceStrSet = true, replaceStr = std::invoke(replaceExpr);
else
replaceStrSet = true, replaceStr = replaceExpr;
}
string.replace(pos, search.size(), replaceStr);
}
}
return string;
}
< /code>
Проблемы: это не шаблон типа строки. И в нем хранится копия строки замены в Replacestr Код: Выделить всё
auto& replace_all1(auto& string, auto search, auto replace)
{
size_t pos = string.find(search);
if(pos == std::basic_string::npos)
return string;
if constexpr(std::is_invocable_v)
auto replaceStr = replace();
else
auto replaceStr = replace;
do
{
string.replace(pos, search.size(), replaceStr);
pos += std::size(replaceStr);
} while((pos = string.find(search, pos)) != std::basic_string::npos);
return string;
}
Подробнее здесь: https://stackoverflow.com/questions/797 ... ng-possibl
Мобильная версия