преобразовать std :: string в const tchar * - PullRequest
0 голосов
/ 28 июня 2018

У меня есть функция, которая принимает параметр с именем arrayOfStrings, определенный следующим образом:

const TCHAR* arrayOfStrings[] = { L"Test" };

Теперь я хотел бы преобразовать строки в вышеприведенный тип, но я не знаю как. Эта ссылка предоставляет решение для преобразования строки в tchar, но не в const tchar *. Эта другая ссылка показывает, как преобразовать строку в tchar *, но не в const tchar *, и выделение памяти является проблемой для меня с этим вторым решением. Как вы, вероятно, можете сказать, я очень новичок в c ++, поэтому любые образовательные советы также приветствуются.

1 Ответ

0 голосов
/ 28 июня 2018

Простой подход, который будет работать со всеми стандартами C ++, будет

 #include <string>

 #include <windows.h>    //   or whatever header you're using that specifies TCHAR

 int main()
 {
       std::string test("Hello");     //   string to be converted

       //   first, if you need a const TCHAR *

       std::basic_string<TCHAR> converted(test.begin(), test.end());

       const TCHAR *tchar = converted.c_str();

       //   use tchar as it is in the required form (const)

       //   second, if you need a TCHAR * (not const)

       std::vector<TCHAR> converted2(test.begin(), test.end());

       TCHAR *tchar2 = &converted2[0];

       // use tchar2 as it is of the required form (non-const).

 }

std::basic_string не предоставляет средства во всех стандартах C ++ для получения не const указателя на свои данные, но std::vector делает. (Предполагая, что вы не используете явное преобразование для введения или удаления const ness).

В C ++ 17 и более поздних версиях все проще: basic_string::data() имеет как перегрузку const, так и не const, чего не было до стандарта 2017 года. До C ++ 11 стандарт не гарантировал, что данные в basic_string будут смежными (даже если реализации обычно реализуют вещи таким образом), но c_str() предоставил адрес первого символа смежного массива. Чистый эффект состоит в том, что в C ++ 17 и более поздних версиях могут использоваться соответствующие перегрузки basic_string::data() или basic_string::c_str(), без необходимости приведения для изменения const ness и без обращения к vector (что было гарантированно иметь смежные элементы во всех стандартах C ++).

Обращает на себя внимание в обоих случаях

  1. Указатели (tchar и tchar2) становятся недействительными, если их соответствующие контейнеры (converted или converted2) изменены или если они перестают существовать. Например, не используйте данные, на которые указывает tchar, если converted вышел из области видимости, так как данные tchar, указывающие на, больше не будут существовать.
  2. Это просто неопределенное поведение - использовать указатели для запуска после конца (никакого магического изменения размера при использовании указателей).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...