コード書いとる??

スクリーンショット 2018-10-25 11.17.44

拙作アプリ開発も終盤に差し掛かってきました。本作は C++14で追加された機能を 積極的に使おうとしてなかなかに苦戦しております。

使ったのは...「2進数リテラル」「std::make_unique」「std::random_shuffle()が非推奨になったので代わりにstd::shuffle()を使う」... 少な!!

習うより慣れろです!! ...歩みは遅いですが...

そんな中C++11から追加されたラムダ式が大活躍です。コールバック用の関数を別途用意する必要がなく、その場で書けて楽チンです。

void callback() { /* do something */ }

int main()
{
  Widget obj;

  // 従来の書き方
  obj.setCallBack(callback);

  // ラムダ式だとその場で処理を書ける
  obj.setCallBack([](){ /* do something */});
}

ラムダ式が強いのはキャプチャでローカル変数を取り込めること。これを従来の方法で実現しようとするとなかなかに難しい!!

int main()
{
  Widget obj;

  int a = 0;
  obj.setCallBack([a](){ /* キャプチャしたaの値を使える */});
}

さらにこうすると...

int main()
{
  std::function<void ()> func_list[2];

  int a = 0;
  func_list[0] = [a](){ /* do something */ };

  int b = 5;
  int c = 10;
  func_list[1] = [b, c](){ /* do something */ };

  for (auto& f : func_list)
  {
    f();
  }
}

おお!! なんかキャプチャが構造体定義の代わりになってるんじゃね?? 継承使わなくても多態性を表現できるっぽい??

と思って盛り上がったのですが... ラムダ式を乱用するとソースコード上で処理の検索性が異様に悪くなるので...一長一短ですな。


ではまた次回。