C++/CX - мне нужно передать Platform::String в метод, который принимает const char*?

Я новичок в C++ (я aC# разработчик).

У меня есть класс-оболочка SQLite, который требует, чтобы вы передали имя базы данных как const char* Однако у меня есть только как Platform::String (после выполнения поиска файла).

Я не могу найти способ конвертировать Platform::String в const char*,

Я видел еще один вопрос о Stackru, который объясняет, почему он не прост, но нет примера кода или сквозного решения.

Может кто-нибудь мне помочь?

Спасибо

2 ответа

Решение

Отказ от ответственности: я мало знаю о 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

Другие вопросы по тегам