Использование Rapidjson и ATL CString

Я пытаюсь использовать библиотеку rapidjson с типом Microsoft ATL CString, как показано в примере ниже.

#include "stdafx.h"
#include "rapidjson\document.h"

using namespace rapidjson;
typedef GenericDocument<UTF16<> > WDocument;

int main()
{
    WDocument document;
    CString hello = _T("Hello");
    document.SetObject();
    document.AddMember(_T("Hello"), hello, document.GetAllocator());
    return 0;
}

Это не удается из-за ошибки компилятора

'rapidjson :: GenericValue :: GenericValue (rapidjson :: GenericValue &&)': невозможно преобразовать аргумент 1 из 'CString' в 'rapidjson :: Type' rapidjson document.h 1020

что означает, что требуется преобразование между CString и форматом, который потребуется Rapidjson. Я знаю, что rapidjson внутренне использует wchar_t в качестве кодировки для версии своих функций UTF16, однако я не уверен, как преобразовать CString в wchar_t (или массив wchar_t) таким образом, чтобы quickjson мог использовать строку как он использует строки, определенные макросом _T.

Я просмотрел ресурсы msdn по преобразованию между строковыми типами здесь, но это только дает возможность вернуть указатель на первый член массива wchar_t, который Rapidjson не может использовать.


person James Fielder    schedule 06.12.2014    source источник
comment
Убедитесь, что вы создали сборку Unicode, или используйте CStringW и L"Hello" (в сборке ANSI CString хранит chars, а не wchar_ts). Может потребоваться явное приведение к const wchar_t* (CStringW предоставляет подходящий оператор преобразования).   -  person Igor Tandetnik    schedule 07.12.2014
comment
Спасибо за предложение, идея преобразования в wchar_t * помогла мне понять, что делать, на что я сейчас отвечу.   -  person James Fielder    schedule 07.12.2014


Ответы (1)


Правильный способ сделать это - использовать один из конструкторов, которые Rapidjson предоставляет для своего класса GenericValue, а именно конструктор для указателя на тип кодировки символов и длину символа.

GenericValue(const Ch* s, SizeType length) RAPIDJSON_NOEXCEPT : data_(), flags_() { SetStringRaw(StringRef(s, length)); }

Этот конструктор может принимать указатель на любой из типов символов, которые принимает Rapidjson вместе с длиной, а затем считывать это в значение. Для класса ATL :: CString это может быть выполнено с помощью методов .GetString() и .GetLength(), доступных для объекта CString. Функция, возвращающая значение, которое можно использовать в дереве DOM, будет выглядеть так:

typedef GenericValue<UTF16<> > WValue;

WValue CStringToRapidjsonValue(CString in)
{
    WValue out(in.GetString(), in.GetLength());
    return out;
}
person James Fielder    schedule 07.12.2014