LoginSignup
2
0

More than 5 years have passed since last update.

Lambdaによるstd::bind を使わないカリー化

Posted at

スコット・メイヤー氏のEffective Modern C++によると、C++11 C++14でstd::bindを使う意味は殆ど無いらしい。理由はstd::placeholders_とかが可読性を下げるから。

  auto func = [](const int &x, const int &y ){ return x*y ;};
  std::cout << func(2,3) << std::endl;

こんなラムダがあったとして

  using namespace std::placeholders;
  auto bindCurried = std::bind(func, 2, _1);
  std::cout << bindCurried(3) << std::endl;

こーやってカリー化すると、プレースホルダーがマジ汚い。
_1はこれから作られる関数の第一引数という意味だが、混乱する。
で、カリー化したい場合に何をするかというと、ラムダをさらに使う。
キャプチャでラムダを受けて、定義しているラムダの中でラムダを実行し、引数を一つ埋めるが、一つは定義するラムダの引数をそのままキャプチャしたラムダに渡す。
(何言ってるのかもはやわからんが、以下を見れば一目瞭然)

  auto curried = [&func](const int &y){
    return func(2, y);
  };
  std::cout << curried(3) << std::endl;

あー。確かに。std::bind要らねーわ。
ただ、ムーブとテンプレート絡める時はC++11ではまだstd::bindを使わなければいけないことがあるらしいが、C++14ではそれもないらしい。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0