Заставить функцию, работающую со старой строкой C (char *, int), работать с std :: string - PullRequest
1 голос
/ 30 ноября 2011

Предположим, у меня действительно сложная функция скремблирования буфера, которая делает что-то со следующим прототипом:

void do_something(char * thebuffer, int thelength);

И предположим, мне нужно получить функцию, работающую с std :: string. Но std :: string.c_str () возвращает const char *, который не является изменяемым.

Помимо создания нового буфера char * и передачи его в do_something, возможно ли использовать do_something для std :: string?

Моя ситуация на самом деле сейчас другая (char *, int в функцию std :: string & take).

Или единственный способ обойти это, это сделать новую копию функции, которая делает то же самое? (что на самом деле не кричит о хорошем стиле)

Ответы [ 3 ]

5 голосов
/ 30 ноября 2011

Вы можете безопасно разыграть его, если он не превышает размер

do_something((char *)mystring.c_str(), mystring.size());

или

do_something(&mystring[0], mystring.size());

или более C++ ish

do_something(const_cast<char *>(mystring.c_str()), mystring.size());

примечание:

std::vector<char> - лучший тип для буфера, чем string.Чем бы вы просто использовали &myvec[0] как char*

1 голос
/ 30 ноября 2011

Вы можете сделать это функцией шаблона и затем передать ей строку :: итератор вместо char *.Или просто заставьте его принять string :: iterator.Если вы используете только последовательный доступ, вам не нужно ничего переписывать в своей функции.

void do_something(string::iterator thebuffer, int thelength);
0 голосов
/ 30 ноября 2011

Не создавать новую функцию, но перегрузить текущую и просто пропустить вещи через.1006 *

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...