Если Вы привыкли думать о ORM-отображенных объектах тогда, это в основном, как работает основанное на объекте хранилище данных как Механизм Приложения Google. Для чего-то как соединения можно посмотреть ссылочные свойства . Вы не должны действительно быть обеспокоены тем, использует ли это BigTable для бэкенда или чего-то еще, так как бэкенд абстрагирован API-интерфейсами Хранилища данных и GQL.
Вы можете вызвать str ()
, чтобы получить обратно std :: string
. Оттуда вы можете вызвать c_str ()
в std :: string
, чтобы получить char *
. Обратите внимание, что c_str ()
официально не поддерживается для этого использования, но все используют его таким образом :)
Edit
Это, вероятно, лучшее решение: std :: istream: : прочтите
. Из примера на этой странице:
buffer = new char [length];
// read data as a block:
is.read (buffer,length);
std :: stringstream
не (обязательно) хранит свой буфер непрерывно, но может выделять фрагменты по мере их постепенного заполнения. Если вы хотите, чтобы все его данные находились в непрерывной области памяти, вам нужно будет скопировать их, и это то, что str ()
делает за вас.
Конечно, если вы хотите использовать или тогда вы можете написать класс с другой стратегией хранения, но тогда вам вообще не нужно использовать std :: stringstream
.
Что ж, если вас серьезно беспокоит хранение, вы можете приблизиться к металлу. basic_stringstream имеет метод rdbuf () , который возвращает его basic_stringbuf (полученный из basic_streambuf ). Затем вы можете использовать указатели eback (), , egptr () и gptr () для доступа к символам непосредственно из буфера. Я использовал этот механизм в прошлом для реализации настраиваемого буфера с моей желаемой семантикой, поэтому он выполним.
Осторожно, это не для слабонервных! Выделите несколько дней, прочтите Standard C ++ IOStreams and Locales или подобную придирчивую ссылку и будьте осторожны ...
Вы можете получить полный контроль над используемым буфером, записав его самостоятельно и используя этот буфер в stringstream
stringstream membuf(std::ios::in | std::ios::out | std::ios::binary);
membuf.rdbuf(yourVeryOwnStreamBuf);
Ваш собственный буфер должен быть получен из basic_streambuf
и соответствующим образом переопределить методы sync ()
и overflow ()
.
Для вашего внутреннее представление, вы, вероятно, могли бы использовать что-то вроде vector
и Reserve ()
его до необходимого размера, чтобы не выполнялись перераспределения и копии.
Это означает, что вы знаете верхняя граница необходимого заранее места. Но если вы заранее не знаете размер и вам понадобится постоянный буфер, копий, конечно, неизбежно.