1

以下の例に示すように、Microsoft ATL CString 型でrapidjsonライブラリを使用しようとしています。

#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 がその関数の UTF16 バージョンのエンコーディングとして wchar_t を内部的に使用していることを知っていますが、rapidjson が文字列を_T マクロで定義された文字列を使用します。

ここで文字列型間の変換に関する msdn リソースを見てきましたが、これは wchar_t の配列の最初のメンバーへのポインターを返す方法しか提供しないため、rapidjson では使用できません。

4

1 に答える 1

1

これを行う正しい方法は、rapidjson がその GenericValue クラスに提供するコンストラクターの 1 つ、つまり、文字エンコーディング タイプと文字長へのポインターのコンストラクターを使用することです。

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

このコンストラクターは、rapidjson が長さと一緒に受け入れる任意の文字型へのポインターを取り、これを値に読み取ることができます。ATL::CString クラスの場合、これはCString オブジェクトで使用できる.GetString()および.GetLength()メソッドで実現できます。DOM ツリーで使用できる値を返す関数は次のようになります。

typedef GenericValue<UTF16<> > WValue;

WValue CStringToRapidjsonValue(CString in)
{
    WValue out(in.GetString(), in.GetLength());
    return out;
}
于 2014-12-07T11:55:49.177 に答える