39

を使用する必要があるたびにstd::bind、代わりにラムダを使用することになります。では、いつ使用する必要がありますstd::bindか?1つのコードベースから削除し終えたところ、ラムダは常に。よりも単純で明確であることがわかりましたstd::bindstd::bind完全に不要ではありませんか?将来的には廃止されるべきではありませんか?std::bindラムダ関数を優先するのはいつですか?(ラムダと同時に標準に組み込まれた理由が必要です。)

私はまた、ますます多くの人々がラムダに精通していることに気づきました(したがって、彼らはラムダが何をするかを知っています)。ただし、とに精通している人ははるかに少なくstd::bindなりstd::placeholdersます。

4

2 に答える 2

32

ラムダではできないことがあります。

std::unique_ptr<SomeType> ptr = ...;
return std::bind(&SomeType::Function, std::move(ptr), _1, _2);

ラムダは移動専用タイプをキャプチャできません。コピーまたは左辺値参照によってのみ値をキャプチャできます。確かにこれは一時的な問題であり、C ++ 14で積極的に解決されています;)

「よりシンプルで明確」は意見の問題です。単純なバインディングの場合、bind入力が大幅に少なくて済みます。bindまた、関数バインディングのみに焦点を当てているため、を見るstd::bindと、何を見ているのかがわかります。一方、ラムダを使用する場合は、ラムダの実装を調べて、それが何をするのかを確認する必要があります。

最後に、C ++は、他の機能がそれを実行できるという理由だけで、物事を非難することはありません。auto_ptr使用することは本質的に危険であり、危険ではない代替手段があるため、非推奨になりました。

于 2013-03-24T12:57:48.877 に答える
24

ラムダでは作成できないポリモーフィックオブジェクトを作成できますstd::bind。つまり、によって返される呼び出しラッパーはstd::bind、さまざまな引数タイプで呼び出すことができます。

#include <functional>
#include <string>
#include <iostream>

struct Polly
{
  template<typename T, typename U>
    auto operator()(T t, U u) const -> decltype(t + u)
    { return t + u; }
};

int main()
{
  auto polly = std::bind(Polly(), std::placeholders::_1, "confusing");

  std::cout << polly(4) << polly(std::string(" this is ")) << std::endl;    
}

私はこれを良いコードの例ではなくパズルとして作成しましたが、ポリモルフィック呼び出しラッパーを示しています。

于 2013-03-24T13:45:36.453 に答える