Как я могу стать владельцем данных C++ std ::string char без копирования и сохранения строкового объекта std ::?

Как я могу стать владельцем строковых данных 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/типами без копирования. Я упоминаю, но не использую потоки, потому что я не уверен в этом вопросе.

10
задан Peter Mortensen 25 June 2015 в 17:02
поделиться