lambda式とは、c++11からサポートされた無名関数です。
Objective-Cで言うblocksみたいなやつなのですが、基礎的な所の注意点を一つ書きたいと思います。
インスタンスはデフォルトで、コピーされる
もう上に書いた通りなのですがコードで見ていきましょう。
「Nodeを格納するVectorを宣言し、そのVectorにlambda式内でNodeを追加する」、と言う感じですね。
Vecto nodes;
function addNode = [nodes]
{
((Vector)nodes).pushBack(Node::create());
};
addNode();
CCLOG("%d", (int)nodes.size());
(ぱっと見、)コード的には1を期待したい所ですが、これは0が出力されます。
何がおかしいのでしょうか。ポインタを出力してみましょう。
(実は、ポインタの出力もつまづいたのでブログ書きましたw)
Vector nodes;
function addNode = [nodes]
{
CCLOG("%p", &nodes);
((Vector)nodes).pushBack(Node::create());
};
addNode();
CCLOG("%p %d", &nodes, (int)nodes.size());
0x178223e88
0x16fd70900 0
そうです、lambda式内ではnodesインスタンスがコピーされて入ったのでポインタも違います。
(これは憶測なのですが)更に、コピーされた際にクラス情報も失いpushBackメソッドが使えなくなっています。
明示的にキャストする事でpushBackを用いています。
参照渡しで解決!
上記は下記の様に訂正する事で正しく動作します。
Vector nodes;
function addNode = [&nodes]
{
CCLOG("%p", &nodes);
nodes.pushBack(Node::create());
};
addNode();
CCLOG("%p %d", &nodes, (int)nodes.size());
出力は以下です。
0x16fd98900
0x16fd98900 1
正しく動作している事が確認出来ました。
更に参照渡しをする事により正しくクラス情報も渡り、pushBackも使える事が確認出来ました。
誰かのお役に立てば。
コメント