2014-10-01 2 views
0

У меня есть программа, которая просит, чтобы у человека был текст, который они хотели бы перевести в Al Bhed, который является всего лишь шифром, где буквы перемещаются, и это говорит SAPI. строка переводит хорошо, но этот кусок кода:.Получение Sapi, чтобы сказать строку

hr = pVoice->Speak(sTranslated, 0, NULL); 

не будет работать, потому что он не говорит «нет подходящей функции преобразования из„станд :: строка“к„сопзЬ WChar *“существует Все, что я хочу для голоса, чтобы сказать, переведенный строку. Как я могу идти об этом?

ответ

1

Сначала вам нужно преобразовать std::string содержание, которое использует тип char, в std::wstring, который использует тип wchar_t. Это связано с тем, что функция ISpVoice::Speak() требует, чтобы первый параметр имел тип LPCWSTR, IOW a "указатель const на широкий символ ter string ". Эта функция может помочь вам.

inline std::wstring s2w(const std::string &s, const std::locale &loc = std::locale()) 
{ 
    typedef std::ctype<wchar_t> wchar_facet; 
    std::wstring return_value; 
    if (s.empty()) 
    { 
     return return_value; 
    } 
    if (std::has_facet<wchar_facet>(loc)) 
    { 
     std::vector<wchar_t> to(s.size() + 2, 0); 
     std::vector<wchar_t>::pointer toPtr = &to[0]; 
     const wchar_facet &facet = std::use_facet<wchar_facet>(loc); 
     if (0 != facet.widen(s.c_str(), s.c_str() + s.size(), toPtr)) 
     { 
      return_value = to.data(); 
     } 
    } 
    return return_value; 
} 

Затем измените строку кода на следующее.

hr = pVoice->Speak(s2w(sTranslated).c_str(), 0, NULL); 

c_str() метод возвращает указатель на «C-строку эквивалентом» из std::wstring объекта. IOW, он возвращает указатель на широкую строку с нулевым завершением.

+0

Благодарим за редактирование, Remy Lebeau. Вы значительно улучшили свой ответ. –

Смежные вопросы