Json :: valueオブジェクトがあり、構造体の値を取得しようとしましたが、キャプチャリストに関するこのエラーが発生しました。私はそのフレーズでこのブレース[]がキャプチャリストを保持していることを理解していますが、どうすればよいかわかりません。ラムダ関数で値を返すにはどうすればよいですか?
void JsonDeneme::setValues(json::value obj)
{
weather.coord.lon = obj.at(L"coord").at(L"lon").as_double();
weather.coord.lat= obj.at(L"coord").at(L"lat").as_double();
}
void JsonDeneme::getHttp()
{
//json::value val;
http_client client(U("http://api.openweathermap.org/data/2.5/weather?q=Ankara,TR"));
client.request(methods::GET)
.then([](http_response response) -> pplx::task<json::value>
{
if (response.status_code() == status_codes::OK)
{
printf("Received response status code:%u\n", response.status_code());
return response.extract_json();
}
return pplx::task_from_result(json::value());
})
.then([ ](pplx::task<json::value> previousTask)
{
try
{
json::value v = previousTask.get();
setValues(v);//-----------------------------------------
}
catch (http_exception const & e)
{
wcout << e.what() << endl;
}
})
.wait();
}
キャプチャリストは、角括弧の間に配置するものです。この例を見てください:
_void foo()
{
int i = 0;
[]()
{
i += 2;
}
}
_
ここで、ラムダは何もキャプチャしないため、外側のスコープにアクセスできず、i
が何であるかがわかりません。それでは、参照でeverythingをキャプチャしましょう。
_void foo()
{
int i = 0;
[&]()//note the &. It means we are capturing all of the enclosing variables by reference
{
i += 2;
}
cout << 2;
}
_
この例では、ラムダ内のi
は、外側のスコープ内のi
への参照です。
この例では、オブジェクトのメンバー関数内にラムダがあります。オブジェクトの関数setValues(v)
を呼び出そうとしていますが、キャプチャリストが空なので、ラムダはsetValues
が何であるかを知りません。ラムダでthis
をキャプチャすると、ラムダはオブジェクトのすべてのメソッドにアクセスできます。これは、setValues(v)
がthis->setValues(v)
と同じであるためです。エラーはなくなります。