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

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

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

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

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

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

Спасибо


person Dean Chalk    schedule 23.11.2012    source источник
comment


Ответы (1)


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

person Mike Seymour    schedule 23.11.2012