STL文字列の変換について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Yakiniku
記事: 17
登録日時: 6年前
住所: 神奈川県

STL文字列の変換について

#1

投稿記事 by Yakiniku » 6年前

いつもお世話になっております。
DXライブラリで通信プログラムを作成していますが、jsonファイルを文字列に変換できず質問しました。
参考にしているプログラムは(http://kagasu.hatenablog.com/entry/2017/10/07/190551)のⅣ.Get部分です。

現在使用しようとしているjson文字列変換することが可能なvalue::as_string メソッドですが、マイクロソフトのリファレンスによると、jsonから文字列に変換する時にC++ STL 文字列形式 を返すとあります。
(https://msdn.microsoft.com/ja-jp/library/jj987912.aspx

つまり、

std::cout << C++ STL 文字列形式 << std::endl

というようには出力できるのですが、

printfDx("%s",C++ STL 文字列形式 );

と書こうとするとエラーでコンパイルできません。




エラー cannot pass object of non-trivial type 'const utility::string_t' (aka 'const basic_string<char>') through variadic function; call will abort at runtime [-Wnon-pod-varargs] test.NativeActivity C:\Users\misov\Desktop\test\test\test.NativeActivity\main.cpp 36

どうやら、const utility::string_t型をchar *型かstring型に変換すれば良いようです。
しかし、std::stringも型キャストできませんし、sprintfもエラーでできません。
何かやり方があるのでしょうか?

コード
► スポイラーを表示

inemaru
記事: 108
登録日時: 7年前

Re: STL文字列の変換について

#2

投稿記事 by inemaru » 6年前

手元で確認していませんが、
その string 型には、c_str() メソッドはありませんか?
ワイド文字でない限りは、対応できると思います。

コード:

printfDx("%s", json["title"].as_string().c_str());  // *エラー箇所。STL文字列を変換する必要がある?

naohiro19[ログオフ]

Re: STL文字列の変換について

#3

投稿記事 by naohiro19[ログオフ] » 6年前

std::string/std::wstringクラスにはメンバー関数にc_strというものを持っています。
このメンバー関数は const char*ならびに const wchar_t*を返す関数となっています。

std::cout がうまくいくのは cout自体が ostreamの typedefになっているからです。

Yakiniku
記事: 17
登録日時: 6年前
住所: 神奈川県

Re: STL文字列の変換について

#4

投稿記事 by Yakiniku » 6年前

inemaru様
naohiro19様

無事サイトからGETすることが出来ました!
ありがとうございます。
ただ、逆にわからない所が出てきたのですが、

>>std::string/std::wstringクラスにはメンバー関数にc_strというものを持っています。

c_strがstd::string/std::wstringクラスのメンバ関数ならば、
as_string()とは一体なんなのでしょうか?
as_string::c_str()
とは書けない訳ですから、少なくともクラス、名前空間のどちらでもないことは明白です。
というよりも、メソッドとリファレンスに記載してあるので、メンバ関数なのでしょうが、
自分の知るメソッドは、

class hoge
{
void hogeFunc();
};

のhogeFunc()くらいのものです。
メソッドは書き方次第でhogeFunc().hogeFunc2()のような書き方が出来るものなのでしょうか?


以下は解決済みのコードです。
► スポイラーを表示

inemaru
記事: 108
登録日時: 7年前

Re: STL文字列の変換について

#5

投稿記事 by inemaru » 6年前

as_string は、メソッドで、戻り値が wstring 型
wstring 型は、c_str メソッドを持ちます。

※ wstring 型を扱う場合は、ロケールの設定が必要な場合があるので注意が必要です。
  適宜調べてください。

コード:

#include <iostream>
#include <string>

struct Foo {
	// string 型 として取得
	std::wstring as_string() const {
		return L"test";
	}
};

int main()
{
	Foo hoge;
	std::wcout << hoge.as_string().c_str() << std::endl;
	
	return 0;
}

Yakiniku
記事: 17
登録日時: 6年前
住所: 神奈川県

Re: STL文字列の変換について

#6

投稿記事 by Yakiniku » 6年前

inemaru様
>>as_string は、メソッドで、戻り値が wstring 型
知識不足のため戻り値が型なのに、メソッドが存在することがピンと来なかったのですが、つまりこういう書き方が可能ということですね。

コード:

#include <stdio.h>

class son
{
public:
	int hoge()
	{
		return 5;
	}
};

class parent
{
public:
	son musuko;
	son hoge()
	{
		return musuko;
	}
};
int main()
{
	parent oya;
	printf("%d\n", oya.hoge().hoge());

	return 0;
}
オブジェクト指向ではクラスも型の一部なのですね。
書き方共に非常に勉強になりました。

返信

“C言語何でも質問掲示板” へ戻る