Как я могу стать владельцем строковых данных std ::без копирования и без сохранения исходного строкового объекта std ::? (Я хочу использовать семантику перемещения, но между разными типами.)
Я использую компилятор C++11 Clang и Boost .
В основном я хочу сделать что-то эквивалентное этому:
{
std::string s(“Possibly very long user string”);
const char* mine = s.c_str();
// 'mine' will be passed along,
pass(mine);
//Made-up call
s.release_data();
// 's' should not release data, but it should properly destroy itself otherwise.
}
Чтобы уточнить, мне нужно избавиться от std ::string :в будущем. Код работает как со строковыми, так и с двоичными данными и должен обрабатывать их в одном и том же формате. И мне нужны данные из строки std ::, потому что они исходят из другого уровня кода, который работает со строкой std ::.
Чтобы дать больше перспективы, когда я сталкиваюсь с желанием сделать это :, например, у меня есть асинхронная оболочка сокета, которая должна иметь возможность принимать как стандартную строку ::, так и двоичные данные от пользователя для записи. Обе версии записи «API» (, принимающие стандартную ::строку или двоичные данные строки ), внутренне разрешаются в одну и ту же (двоичную )запись. Мне нужно избегать копирования, так как строка может быть длинной.
WriteId write( std::unique_ptr< std::string > strToWrite )
{
// Convert std::string data to contiguous byte storage
// that will be further passed along to other
// functions (also with the moving semantics).
// strToWrite.c_str() would be a solution to my problem
// if I could tell strToWrite to simply give up its
// ownership. Is there a way?
unique_ptr > dataToWrite= ??
//
scheduleWrite( dataToWrite );
}
void scheduledWrite( std::unique_ptr< std::vecor > data)
{
…
}
std ::unique _ptr в этом примере для иллюстрации передачи права собственности :любой другой подход с той же семантикой мне подходит.
Меня интересуют решения для этого конкретного случая (с буфером std ::string char )и подобного рода проблемами со строками, потоками и подобными общими :советами по перемещению буферов между строкой, потоком, стандартным контейнеры и типы буферов.
Я также был бы признателен за советы и ссылки с подходами к проектированию С++ и конкретными методами, когда речь идет о передаче данных буфера между различными API/типами без копирования. Я упоминаю, но не использую потоки, потому что я не уверен в этом вопросе.