Функция замены строки, которая заменяет все входы на новую строку, возможно, от фанктора, в качестве шаблона для всех стC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Функция замены строки, которая заменяет все входы на новую строку, возможно, от фанктора, в качестве шаблона для всех ст

Сообщение Anonymous »

Я ищу (своего рода универсальный швейцарский армейский нож), которая заменяет все вхождения строки поиска в данном строке., std :: string_view , std :: string , char*(*) () , std :: function , ...). Все, что оценивает новую строку, также должно работать в качестве аргумента для нового текста замены. /> < /li>
[*] Функция должна обрабатывать случай, когда новый текст поставляется во временный объект (

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

std::string
Например). Таким образом, ему необходимо продлить срок службы этого временного (или копировать значение, но это кажется неэффективным и следует избегать) < /p>
< /li>
Параметр строки замены должен оцениваться только один раз (по крайней мере, в случае, если это функтор). То есть он не должен создавать дорогие временные объекты (например, временную строку), если они впоследствии не используются. (Причина: мой вариант использования состоит из очень большого количества вызовов для функции замены только с несколькими фактическими замены.) Компиляторы и новые изменения C ++ могут помочь другим. (Поэтому я не добавляю тег VS2022.)


edit:
с предложениями от Pepijn Kramer и Igor Tandetnik, я пришел с моим текущим решением. Но у него есть 2 отдельные функции, и я хочу функцию «все в одном». Итак, вот: < /p>

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

template 
using char_type_t = typename std::conditional_t<
std::is_same_v,
char,
typename std::conditional_t
>;

auto& replace_all(auto& string, auto search, auto replace)
{
using string_type = decltype(string);
using char_type = char_type_t;
using string_view = std::basic_string_view>;
size_t pos = string.find(search);
if(pos == std::basic_string::npos)
return string;
string_view search_{search};
auto do_replace = [&](string_view replaceStr)
{
do
{
string.replace(pos, search_.size(), replaceStr);
pos += std::size(replaceStr);
} while((pos = string.find(search, pos)) != std::basic_string::npos);
};
if constexpr(std::is_invocable_v)
{
const auto& replace_ret = replace();
do_replace(replace_ret);
}
else
do_replace(replace);
return string;
}
Подробности:
Я использую std :: string_view для текста для поиска и для текста, чтобы заменить для обработки всех видов типов ввода текста. И для замены текста, поступающего из вызова функции, он использует ссылку на константу, чтобы продлить срок службы результата этого вызова (

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

const auto& replace_ret = replace();
).
Это, кажется, работает со всеми типами, которые мне требуются для параметра замены. То есть для нового текста я могу использовать char*, std :: string_view , std :: string , char*(*) () и std :: function (или wchar_t equivalents, как я на Windows). Я имею в виду, что он состоит из двух функций (основная функция replys_all и вспомогательная функция char_type_t ), но я хочу, чтобы все решение только в одной функции.
Итак, вопрос:
Как будет выглядеть единственная функция, которая может иметь функциональность моего решения? объединить две мои функции в одну или найти другую функцию, выполняющую эквивалент.)
Спасибо

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

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

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

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

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

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