Простой подход, который будет работать со всеми стандартами 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 ++).
Обращает на себя внимание в обоих случаях
- Указатели (
tchar
и tchar2
) становятся недействительными, если их соответствующие контейнеры (converted
или converted2
) изменены или если они перестают существовать. Например, не используйте данные, на которые указывает tchar
, если converted
вышел из области видимости, так как данные tchar
, указывающие на, больше не будут существовать.
- Это просто неопределенное поведение - использовать указатели для запуска после конца (никакого магического изменения размера при использовании указателей).