Вопрос Спавн/смерть рошана

Пользователь
Статус
Оффлайн
Регистрация
8 Апр 2022
Сообщения
663
Реакции[?]
104
Поинты[?]
67K
Какая функция вызывается при спавне и смерти рошана? хочу их хукнуть и сделать оповещие о его возраждении и смерти.
 
🤡
Пользователь
Статус
Оффлайн
Регистрация
28 Апр 2014
Сообщения
127
Реакции[?]
163
Поинты[?]
21K
Пожалуйста, авторизуйтесь для просмотра ссылки.
GameEvents, добавляешь листенера на dota_roshan_kill. В момент убийства чекаешь внутреигровое время и считаешь от этого времени минимальное время возрождения и максимальное.
Профит?
 
https://qweme.dev
Пользователь
Статус
Оффлайн
Регистрация
25 Май 2022
Сообщения
165
Реакции[?]
87
Поинты[?]
21K
Какая функция вызывается при спавне и смерти рошана? хочу их хукнуть и сделать оповещие о его возраждении и смерти.
C++:
typedef bool(*FireEventClientSideFn)(CGameEventManager*, CGameEvent*);
FireEventClientSideFn oFireEventClientSide;

bool hkFireEventClientSide(CGameEventManager* thisptr, CGameEvent* event) {
    const char* eventName = event->GetName();
    if (!eventName)
        return oFireEventClientSide(thisptr, event);

    else if (!strcmp(eventName, "dota_roshan_kill"))
        GameData.RoshanKillTime = vmt.GameRules->GameTime();
...
:)
 
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
779
Реакции[?]
331
Поинты[?]
63K
C++:
typedef bool(*FireEventClientSideFn)(CGameEventManager*, CGameEvent*);
FireEventClientSideFn oFireEventClientSide;

bool hkFireEventClientSide(CGameEventManager* thisptr, CGameEvent* event) {
    const char* eventName = event->GetName();
    if (!eventName)
        return oFireEventClientSide(thisptr, event);

    else if (!strcmp(eventName, "dota_roshan_kill"))
        GameData.RoshanKillTime = vmt.GameRules->GameTime();
...
:)
возможно стоит перестать strcmp и const char* использовать в 2022 году.
std::string_view CGameEvent::GetName()//c++17
{
if(name_ptr_const_char) return {name_ptr_const_char};
return {};//нельзя из нуллптр конструировать, пустой возвращай если нуллптр
}
...
C++:
bool hkFireEventClientSide(CGameEventManager* thisptr, CGameEvent* event) {
    if (const std::string_view eventName = event->GetName(); !eventName.empty())
    {
        if(eventName == "dota_roshan_kill")
            GameData.RoshanKillTime = vmt.GameRules->GameTime();
        ...
    }
    return oFireEventClientSide(thisptr, event);
}
или еще лучше регай ивент листенеры и бегай в хуке по ним и давай ивенты тому кому они нужны(aka dispatch)
C++:
bool hkFireEventClientSide(CGameEventManager* thisptr, CGameEvent* event) {
    if (const std::string_view eventName = event->GetName(); !eventName.empty())
    {
        if(EventManager.Dispatch(eventName))// =>
            //bool consume = false;
            //for each event in event_list {
            //    if(event.name == eventName) {
            //        event.callback();
            //        if(!consume)
            //            consume = event.ShouldConsume();
            //    }
            //}
            //return consume;
            return true;
    }
    return oFireEventClientSide(thisptr, event);
}
...
class RoshanKillEventListener : public EventListener<RoshanKillEventListener, "dota_roshan_kill">
{
public:
    static void callback() noexcept
    {
        GameData.RoshanKillTime = vmt.GameRules->GameTime();
    }
    static void ShouldConsume() noexcept { return true; }
}
...
 
Пользователь
Статус
Оффлайн
Регистрация
8 Апр 2022
Сообщения
663
Реакции[?]
104
Поинты[?]
67K
А разве нельзя узнать когда он возродился? В hake.me вроде было такое, когда рошан возраждался писало, что он заспавнен
UPD: хукнул OnAddEntity, но оказывается инфа о спавне передаётся ток тогда, когда есть вижен(
 
Последнее редактирование:
X
Статус
Оффлайн
Регистрация
20 Июн 2021
Сообщения
299
Реакции[?]
75
Поинты[?]
15K
А разве нельзя узнать когда он возродился? В hake.me вроде было такое, когда рошан возраждался писало, что он заспавнен
И сейчас есть) благо апи гибкое достаточно
 
https://qweme.dev
Пользователь
Статус
Оффлайн
Регистрация
25 Май 2022
Сообщения
165
Реакции[?]
87
Поинты[?]
21K
А разве нельзя узнать когда он возродился? В hake.me вроде было такое, когда рошан возраждался писало, что он заспавнен
про точное время нельзя врроде бы
а так от 8 до 11 минут гейм тайма вот и считай лол
 
Начинающий
Статус
Оффлайн
Регистрация
8 Фев 2022
Сообщения
132
Реакции[?]
15
Поинты[?]
8K
5 ночей на aim_ag_texture2
Эксперт
Статус
Оффлайн
Регистрация
6 Апр 2017
Сообщения
826
Реакции[?]
401
Поинты[?]
11K
возможно стоит перестать strcmp и const char* использовать в 2022 году.
std::string_view CGameEvent::GetName()//c++17
{
if(name_ptr_const_char) return {name_ptr_const_char};
return {};//нельзя из нуллптр конструировать, пустой возвращай если нуллптр
}
...
C++:
bool hkFireEventClientSide(CGameEventManager* thisptr, CGameEvent* event) {
    if (const std::string_view eventName = event->GetName(); !eventName.empty())
    {
        if(eventName == "dota_roshan_kill")
            GameData.RoshanKillTime = vmt.GameRules->GameTime();
        ...
    }
    return oFireEventClientSide(thisptr, event);
}
или еще лучше регай ивент листенеры и бегай в хуке по ним и давай ивенты тому кому они нужны(aka dispatch)
C++:
bool hkFireEventClientSide(CGameEventManager* thisptr, CGameEvent* event) {
    if (const std::string_view eventName = event->GetName(); !eventName.empty())
    {
        if(EventManager.Dispatch(eventName))// =>
            //bool consume = false;
            //for each event in event_list {
            //    if(event.name == eventName) {
            //        event.callback();
            //        if(!consume)
            //            consume = event.ShouldConsume();
            //    }
            //}
            //return consume;
            return true;
    }
    return oFireEventClientSide(thisptr, event);
}
...
class RoshanKillEventListener : public EventListener<RoshanKillEventListener, "dota_roshan_kill">
{
public:
    static void callback() noexcept
    {
        GameData.RoshanKillTime = vmt.GameRules->GameTime();
    }
    static void ShouldConsume() noexcept { return true; }
}
...
наебашут хуйни из std а потом думают че код начинает крашить хуй знает из за чего умники мля
 
🤡
Пользователь
Статус
Оффлайн
Регистрация
28 Апр 2014
Сообщения
127
Реакции[?]
163
Поинты[?]
21K
наебашут хуйни из std а потом думают че код начинает крашить хуй знает из за чего умники мля
Действительно, ведь в Сишном коде так мало моментов когда может произойти утечка памяти. Что уж там. Нахуя С++ развивается. Давайте откатимся на С++98 и будем сидеть, хуи дрочить на нем?
 
Последнее редактирование:
Пользователь
Статус
Оффлайн
Регистрация
8 Апр 2022
Сообщения
663
Реакции[?]
104
Поинты[?]
67K
Пожалуйста, авторизуйтесь для просмотра ссылки.
GameEvents, добавляешь листенера на dota_roshan_kill. В момент убийства чекаешь внутреигровое время и считаешь от этого времени минимальное время возрождения и максимальное.
Профит?
Как я понял нужно сделать вот
Пожалуйста, авторизуйтесь для просмотра ссылки.
.
Паттерн находит, но получаю это исключение:
Пожалуйста, авторизуйтесь для просмотра ссылки.
Cорян, шо так туплю)
 
🤡
Пользователь
Статус
Оффлайн
Регистрация
28 Апр 2014
Сообщения
127
Реакции[?]
163
Поинты[?]
21K
Как я понял нужно сделать вот
Пожалуйста, авторизуйтесь для просмотра ссылки.
.
Паттерн находит, но получаю это исключение:
Пожалуйста, авторизуйтесь для просмотра ссылки.
Cорян, шо так туплю)
Я не ебу, что у тебя там за паттерн, но я надеюсь ты не тупо пастишь откуда хуй пойми в надежде что все еще рабочее?

И то, что ты написал, какая-то шиза.
Есть CS:GO, много есть совпадений. Есть сурсы тф2 и ксго ликнутые.
Столько туториолов. Мужик. Вот тебе тутор:
Пожалуйста, авторизуйтесь для просмотра ссылки.
(читай, пробуй понять ЧТО ОНИ ДЕЛАЮТ). Сразу говорю, пастить оттуда без разбора - нету смысла, там не очень код. Просто для ознакомления.

А вообще, если тебе похуй, можешь просто хукнуть FireEventClientSide как выше писали и тогда тебе не надо будет думать о том как добавлять листенеры, но я предпочитаю когда есть возможность обойтись без лишних хуков.

Вот так я получаю поинтер на таблицу.
C++:
 const std::uintptr_t* player_info_changed = *reinterpret_cast<std::uintptr_t**>(sdk::g_client) + 13;
    //13th function in Source2Client vtable
if (!player_info_changed)
   throw std::runtime_error("Failed to obtain Interface #5:4");

addr_start = *player_info_changed + 0x5B;
sdk::g_gameeventmanager = *reinterpret_cast<CGameEventManager**>(g_tools->GetAbsoluteAddress(
        addr_start));
if (!sdk::g_gameeventmanager)
   throw std::runtime_error("Failed to obtain Interface #5:4.");
 
Последнее редактирование:
Пользователь
Статус
Оффлайн
Регистрация
8 Апр 2022
Сообщения
663
Реакции[?]
104
Поинты[?]
67K
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
779
Реакции[?]
331
Поинты[?]
63K
Как я понял нужно сделать вот
Пожалуйста, авторизуйтесь для просмотра ссылки.
.
Паттерн находит, но получаю это исключение:
Пожалуйста, авторизуйтесь для просмотра ссылки.
Cорян, шо так туплю)
CGameEventListener2* gameEventListener;//отсутствие инита = дефолт инит = зеро инит т.к. нон-класс + статик = nullptr
gameEventManager->AddListener(gameEventListener, "dota_roshan_kill", false);// эквивалентно gameEventManager->AddListener(nullptr, "dota_roshan_kill", false);
вопрос, как nullptr(а именно его ты в качестве листенера и передаешь) будет реагировать на ивент dota_roshan_kill? ответ - крашить xD
1655826909900.png
thinking.jpg
 
Shitcode lord 💩
Забаненный
Статус
Оффлайн
Регистрация
25 Ноя 2020
Сообщения
272
Реакции[?]
84
Поинты[?]
8K
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
возможно стоит перестать strcmp и const char* использовать в 2022 году.
std::string_view CGameEvent::GetName()//c++17
{
if(name_ptr_const_char) return {name_ptr_const_char};
return {};//нельзя из нуллптр конструировать, пустой возвращай если нуллптр
}
...
C++:
bool hkFireEventClientSide(CGameEventManager* thisptr, CGameEvent* event) {
    if (const std::string_view eventName = event->GetName(); !eventName.empty())
    {
        if(eventName == "dota_roshan_kill")
            GameData.RoshanKillTime = vmt.GameRules->GameTime();
        ...
    }
    return oFireEventClientSide(thisptr, event);
}
или еще лучше регай ивент листенеры и бегай в хуке по ним и давай ивенты тому кому они нужны(aka dispatch)
C++:
bool hkFireEventClientSide(CGameEventManager* thisptr, CGameEvent* event) {
    if (const std::string_view eventName = event->GetName(); !eventName.empty())
    {
        if(EventManager.Dispatch(eventName))// =>
            //bool consume = false;
            //for each event in event_list {
            //    if(event.name == eventName) {
            //        event.callback();
            //        if(!consume)
            //            consume = event.ShouldConsume();
            //    }
            //}
            //return consume;
            return true;
    }
    return oFireEventClientSide(thisptr, event);
}
...
class RoshanKillEventListener : public EventListener<RoshanKillEventListener, "dota_roshan_kill">
{
public:
    static void callback() noexcept
    {
        GameData.RoshanKillTime = vmt.GameRules->GameTime();
    }
    static void ShouldConsume() noexcept { return true; }
}
...
Чтобы что? Зачем переделывать 60к строк кода, чтобы там был не "си стайл", а всратый стрингвью, который во всем хуже конст чара?
Нихуя не понимаю твоей притензии.
 
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
779
Реакции[?]
331
Поинты[?]
63K
Чтобы что? Зачем переделывать 60к строк кода, чтобы там был не "си стайл", а всратый стрингвью, который во всем хуже конст чара?
Нихуя не понимаю твоей притензии.
ну лично я считаю наоборот - конст чар хуже стрингвью. конст чар это ваще прошлый век если порассуждать. стрингвью - это указатель на память и РАЗМЕР. конст чар же в себе никакой информации о размере не несёт. null-terminated строки это ваще мусор впринципе который просто тащится из прошлого столетия и токо для лоу-левел хуиты юзается. строки хранящие размер гораздо эффективнее, тебе не надо как дауну всякие strlen и тд юзать(+ ты заранее(не итерируя строку до конца пока 0 не встретишь как в случае с конст чаром) можешь память зарезервировать ибо ты знаешь сколько строка весит). ТАКЖЕ этот же самый string_view очень ахуенно используется и в компайл-тайм программировании. ТАКЖЕ есть operator== который позволяет сравнивать имена привычным синтаксисом a == "b". и вдобавок к этому operator== еще и работает так что если std::string_view пустой то он сразу false возвращает
то есть по факту можно сделать даже так
C++:
bool hkFireEventClientSide(CGameEventManager* thisptr, CGameEvent* event) {
        if(event->GetName() == "dota_roshan_kill")//даже если name_ptr = нуллптр, то ваще похуй, вернётся пустой std::string_view(используя код в прошлом посте) и он сразу выдаст false в оператор==
            GameData.RoshanKillTime = vmt.GameRules->GameTime();
        ...
    return oFireEventClientSide(thisptr, event);
}
ТАКЖЕ там есть substr(который не трогает память не копирует и нихуя не делает такого) find и прочая удобная хуита. ТАКЖЕ есть конструкция из рейнджей(c++23. то есть можно из std::vector сделать спокойно std::string_view) и интеграция со всякой рейндж хуитой(c++20. можно спокойно перевернуть строку например(std::ranges::views::reverse), или же перевести в верхний нижний регистр не трогая при этом саму память(std::ranges::views::transform) и тд и тп). блядь да там ваще всё есть, лол. конст чар это ваще мусор, он кроме апи нигде больше и не должен юзаться. в самом коде конкретно твоей приложухи(ну всмысле в компонентах которые не связаны напрямую с самим пространством игры) конст чар нахуй не нужен. и я уже не говорю про то что перед strcmp можно забыть восклицательный знак поставить( if (!strcmp()) ) и вот тебе халявный баг. с == такой хуйни уже не будет
тебе взяли strcmp strstr и прочий шлак завернули красиво. нужен конст чар - ебашь .data() и вот он тебе. не забывай - конст чар это даже не строка. это просто число. работать с голым числом когда тебе нужна строка - это С. С говно по одной простой причине - если он не говно, зачем люди придумывают другие языки? я не говорю что с++ идеальный язык, он тоже дерьмо, но всяко лучше чем С
конечно код надо переписывать, а как ты думал? если ты не хочешь апдейтить свой продукт то получается что он говно. апдейт это не просто фичу добавить. апдейт это прежде всего перепись и модернизация основных и базовых компонентов и дизайнов ПО. выходят новые технологии, новые фичи. ты становишься более опытный как программист, находишь новые способы решения задач. я раньше тоже много вещей делал в С-стайле а потом стал понимать что есть варианты более эффективные более простые более мощные более гибкие более управляемые. как по мне, тупо сидеть на месте и мусолить старое говно это слишком консервативно. можно с тем же успехом комп из лампочек собрать пойти и на нем ебашить. или еще лучше на абаке сидеть высчитывать.
у меня например 90к строк именно чисто модулярного кода(.ixx, модули из с++20. то есть код написанный под самый современный манер), и абсолютно все что у меня там написано - я считаю мусором. код полностью рабочий, мощный, классный, но в нем все равно есть проблемы и есть места где нужны улучшения. и точно так же я всё это говно буду заново переписывать, получая на выходе всё более качественные либы и как следствее более корректный функционал. я бы мог сидеть и тупо дрочить его вечность, код то ведь рабочий. решает задачи успешно. но это вовсе не значит что он идеальный и его не надо улучшать.
в общем нихуя не понимаю почему стрингвью "всратый". и точно не понимаю где он хуже конст чара(ты в любой момент конст чар можешь достать обратно через .data()). еще скажи что ты std::string не юзаешь)) std::string_view - точно такой же std::string только не хранящий в себе сами символы, а ссылающийся на чужую память. из std::string_view можно в любой момент сконструировать std::string или же наоборот из std::string можно спокойно сделать std::string_view.
возможно ты просто как-то не так использовал string_view?
да и в конце концов, ты всегда можешь по-тихоньку переписывать(либо всё так оставить и последующий код уже на другой манер писать), начав с конкретно этого куска кода. не обязательно же весь код сразу переделывать.
 
Последнее редактирование:
Легенда форума
Статус
Оффлайн
Регистрация
10 Дек 2018
Сообщения
4,380
Реакции[?]
2,284
Поинты[?]
189K
Эмм, а в чём их проблема?
А, ладно, увидел.
Странное и максимально токсичное мнение.

Я почитал буквально два тредда на стаковерфлоу, и, похоже, что разница между ними очень даже небольшая. И стандартный вариант с конст чаром иногда даже выигрывает.
 
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
779
Реакции[?]
331
Поинты[?]
63K
А, ладно, увидел.
Странное и максимально токсичное мнение.

Я почитал буквально два тредда на стаковерфлоу, и, похоже, что разница между ними очень даже небольшая. И стандартный вариант с конст чаром иногда даже выигрывает.
так в том то и суть что разница с точки зрения имплементации небольшая(стрингвью это тот же самый старый добрый конст чар и еще размер)(= совместимость туда сюда и обратно), но при этом у тебя еще и новые плюхи. у тебя есть всё старое(ты можешь в апи передавать свои конст чары), и при этом можешь еще и новое что-то делать(substr например пиздец какая имба, легко быстро удобно и никакого копирования). но с другой стороны функциональная разница между ними очень большая хотя бы потому что конст чар это число а стрингвью это класс(две статьи на стаковерфлове тебе не объяснят всей сути, тем более что стрингвью активно используется и эволюционируется еще дальше в с++20 и в с++23 и становится еще лучше). стрингвью создан для того чтобы те же самые вещи которые ты делаешь конст чаром можно было бы сделать с такой же производительностью и гораздо удобнее и гибче. std::string тоже имеет всякие утилиты типа substr и тд но они нихуя не эффективные по производительности. string_view это просто коллекция все тех же самых утилит но которые ничем не уступают голому С(потому что они под колпаком этот голый С и юзают - это просто оберточка). просто не понимаю почему бы не задействовать полный потенциал языка который тебе дали специально чтобы ты не напрягался.
по спидам конст чар довольно часто будет сосать хотя бы просто потому, что он не несёт в себе размера. strlen нужно вызывать(то есть он бегает по всей строке и ищет ноль) чтобы размер узнать. стрингвью же внутри себя этот размер хранит и ты куда угодно можешь потом этот стрингвью передавать и кому надо те сразу могут размер взять не пересчитывая нихуя.
была функа void MyShit(const char* str, std::size_t str_length) и ты ее вызывал условно MyShit("test", strlen("test")), а стало просто
void MyShit(std::string_view str) и ты ее вызываешь MyShit("test"). под колпаком по факту точно так же вызвается тот же самый strlen, токо тебе это не надо руками делать. а этот размер в итоге внутри этого стрингвью хранится и ты дальше вниз можешь передавать куда угодно и не париться. лишним аргументом размер передавать не надо, и пересчитывать стрлен тоже не надо
 
Последнее редактирование:
Shitcode lord 💩
Забаненный
Статус
Оффлайн
Регистрация
25 Ноя 2020
Сообщения
272
Реакции[?]
84
Поинты[?]
8K
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
ну лично я считаю наоборот - конст чар хуже стрингвью. конст чар это ваще прошлый век если порассуждать. стрингвью - это указатель на память и РАЗМЕР. конст чар же в себе никакой информации о размере не несёт. null-terminated строки это ваще мусор впринципе который просто тащится из прошлого столетия и токо для лоу-левел хуиты юзается. строки хранящие размер гораздо эффективнее, тебе не надо как дауну всякие strlen и тд юзать(+ ты заранее(не итерируя строку до конца пока 0 не встретишь как в случае с конст чаром) можешь память зарезервировать ибо ты знаешь сколько строка весит). ТАКЖЕ этот же самый string_view очень ахуенно используется и в компайл-тайм программировании. ТАКЖЕ есть operator== который позволяет сравнивать имена привычным синтаксисом a == "b". и вдобавок к этому operator== еще и работает так что если std::string_view пустой то он сразу false возвращает
то есть по факту можно сделать даже так
C++:
bool hkFireEventClientSide(CGameEventManager* thisptr, CGameEvent* event) {
        if(event->GetName() == "dota_roshan_kill")//даже если name_ptr = нуллптр, то ваще похуй, вернётся пустой std::string_view(используя код в прошлом посте) и он сразу выдаст false в оператор==
            GameData.RoshanKillTime = vmt.GameRules->GameTime();
        ...
    return oFireEventClientSide(thisptr, event);
}
ТАКЖЕ там есть substr(который не трогает память не копирует и нихуя не делает такого) find и прочая удобная хуита. ТАКЖЕ есть конструкция из рейнджей(c++23. то есть можно из std::vector сделать спокойно std::string_view) и интеграция со всякой рейндж хуитой(c++20. можно спокойно перевернуть строку например(std::ranges::views::reverse), или же перевести в верхний нижний регистр не трогая при этом саму память(std::ranges::views::transform) и тд и тп). блядь да там ваще всё есть, лол. конст чар это ваще мусор, он кроме апи нигде больше и не должен юзаться. в самом коде конкретно твоей приложухи(ну всмысле в компонентах которые не связаны напрямую с самим пространством игры) конст чар нахуй не нужен. и я уже не говорю про то что перед strcmp можно забыть восклицательный знак поставить( if (!strcmp()) ) и вот тебе халявный баг. с == такой хуйни уже не будет
тебе взяли strcmp strstr и прочий шлак завернули красиво. нужен конст чар - ебашь .data() и вот он тебе. не забывай - конст чар это даже не строка. это просто число. работать с голым числом когда тебе нужна строка - это С. С говно по одной простой причине - если он не говно, зачем люди придумывают другие языки? я не говорю что с++ идеальный язык, он тоже дерьмо, но всяко лучше чем С
конечно код надо переписывать, а как ты думал? если ты не хочешь апдейтить свой продукт то получается что он говно. апдейт это не просто фичу добавить. апдейт это прежде всего перепись и модернизация основных и базовых компонентов и дизайнов ПО. выходят новые технологии, новые фичи. ты становишься более опытный как программист, находишь новые способы решения задач. я раньше тоже много вещей делал в С-стайле а потом стал понимать что есть варианты более эффективные более простые более мощные более гибкие более управляемые. как по мне, тупо сидеть на месте и мусолить старое говно это слишком консервативно. можно с тем же успехом комп из лампочек собрать пойти и на нем ебашить. или еще лучше на абаке сидеть высчитывать.
у меня например 90к строк именно чисто модулярного кода(.ixx, модули из с++20. то есть код написанный под самый современный манер), и абсолютно все что у меня там написано - я считаю мусором. код полностью рабочий, мощный, классный, но в нем все равно есть проблемы и есть места где нужны улучшения. и точно так же я всё это говно буду заново переписывать, получая на выходе всё более качественные либы и как следствее более корректный функционал. я бы мог сидеть и тупо дрочить его вечность, код то ведь рабочий. решает задачи успешно. но это вовсе не значит что он идеальный и его не надо улучшать.
в общем нихуя не понимаю почему стрингвью "всратый". и точно не понимаю где он хуже конст чара(ты в любой момент конст чар можешь достать обратно через .data()). еще скажи что ты std::string не юзаешь)) std::string_view - точно такой же std::string только не хранящий в себе сами символы, а ссылающийся на чужую память. из std::string_view можно в любой момент сконструировать std::string или же наоборот из std::string можно спокойно сделать std::string_view.
возможно ты просто как-то не так использовал string_view?
да и в конце концов, ты всегда можешь по-тихоньку переписывать(либо всё так оставить и последующий код уже на другой манер писать), начав с конкретно этого куска кода. не обязательно же весь код сразу переделывать.
Да... звучит убедительно. Ну, видимо настало время мне ебейшую кучу кода переписать и перестать уже быть консерватором.
Энивей, спасибо за развернутый ответ. Теперь я понял, о чем ты.
UPD: Справебыдлости ради, я видимо просто не очень понимал, как все эти новые приколы работают.
Почитал документацию щас. Да, штука крутая, глупо её не юзать.
 
Сверху Снизу