Я новичок в C ++ (я разработчик C #).
У меня есть класс-оболочка SQLite, который требует, чтобы вы передали имя базы данных как const char*
Однако у меня есть только как Platform::String
(после поиска файла).
Я не могу найти способ преобразовать Platform::String
в const char*
,
Я видел еще один вопрос о StackOverflow, который объясняет, почему он не прост, но нет примера кода или сквозного решения.
Может кто-нибудь мне помочь ?
Спасибо
Отказ от ответственности: я мало знаю о C ++ / CX, и я основываю ответ на документации Вот.
String
класс содержит 16-битные символы Unicode, поэтому вы не можете напрямую получить указатель на 8-битный char
типизированные символы; вам нужно будет конвертировать содержимое.
Если известно, что строка содержит только символы ASCII, вы можете преобразовать ее напрямую:
String s = whatever();
std::string narrow(s.Begin(), s.End());
function_requiring_cstring(narrow.c_str());
Иначе, строка будет нуждаться в переводе, который становится довольно волосатым. Следующее может сделать правильно, преобразовав широкие символы в многобайтовые последовательности узких символов:
String s = whatever();
std::wstring wide(s.Begin(), s.End());
std::vector<char> buffer(s.Length()+1); // We'll need at least that much
for (;;) {
size_t length = std::wcstombs(buffer.data(), wide.c_str(), buffer.size());
if (length == buffer.size()) {
buffer.resize(buffer.size()*2);
} else {
buffer.resize(length+1);
break;
}
}
function_requiring_cstring(buffer.data());
Кроме того, вам может быть проще игнорировать идеи Microsoft о том, как следует обрабатывать строки, и использовать std::string
вместо.
Эта ссылка может быть полезна для понимания строк C ++ / CX:
http://msdn.microsoft.com/en-us/library/windows/apps/hh699879(v=vs.110).aspx