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