読者です 読者をやめる 読者になる 読者になる

ゆとりーなの日記

日記的な事を書いて行くと思はれる

ブロック構文はC++アルゴリズムに突っ込める

 Objective-Cのブロック構文を見ていて、呼び出し方法が通常の函数ポインタや函数オブジェクトと変わらないので最強のテンプレート構文を保持するC++アルゴリズムに突っ込めば動くんじゃないかと思い試してみたら動きました。

#include <iostream>
#include <vector>

#include <boost/range/algorithm/for_each.hpp>

int main() {
  std::vector<int> v;
  
  v.push_back(0);
  v.push_back(1);
  v.push_back(2);
  v.push_back(3);
  v.push_back(4);
  
  boost::for_each(v, ^(int i) {
    std::cout << i << std::endl;
  });
  
  return 0;
}

出力

0
1
2
3
4

 で、次に気になるのは当然ローカル変数のキャプチャですが、C++0xのラムダと違ってマクロ香がプンプンするObjective-Cのことだから特になんもせんでもキャプチャ出来るんだろうなと思ったら案の定出来ました。

#include <iostream>
#include <vector>

#include <boost/range/algorithm/for_each.hpp>

int main() {
  std::vector<int> v;
  
  v.push_back(0);
  v.push_back(1);
  v.push_back(2);
  v.push_back(3);
  v.push_back(4);
  
  const int local = 313;
  
  boost::for_each(v, ^(int i) {
    std::cout << i + local << std::endl;
  });
  
  return 0;
}

出力

313
314
315
316
317

Block_copyってどうなの?

 個人的な印象としては、ブロックリテラルのスコープの外でブロックを利用するときに必要そうな雰囲気を感じ取っているので、アルゴリズムの引数でブロックリテラルを渡す場合はアルゴリズム実行中には流石にブロックリテラルが生きているので今回のような場合は特にBlock_copyとかしなくてもいいんだろうなーという感じではいます。違ったらすいません。はい。

述語とかの話

 恐らくC++アルゴリズムブロック構文の中で__blockを使ってキャプチャした変数を書き換えたり、static変数を作って状態を管理するとかはやめておいた方がいいかと思います。