簡體   English   中英

什么時候應該使用std :: bind?

[英]When should I use std::bind?

每當我需要使用std::bind ,我最終都會使用lambda代替。 所以我什么時候應該使用std::bind 我剛從一個代碼庫中刪除它,我發現lambda總是比std::bind更簡單明了。 std::bind完全沒有必要嗎? 將來不應該棄用嗎? 我什么時候應該首選std::bind到lambda函數? (一定有理由要使它與lambdas同時進入標准。)

我還注意到,越來越多的人熟悉lambda(因此他們知道lambda的作用)。 但是,很少有人熟悉std::bindstd::placeholders

這是lambda無法做到的:

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

Lambda無法捕獲僅移動類型。 它們只能通過副本或左值引用捕獲值。 盡管誠然這是一個暫時的問題,但對於C ++ 14來說正在積極解決中;)

“更簡單,更清晰”是一個見解。 對於簡單的綁定情況, bind可以減少很多鍵入工作。 bind也只專注於函數綁定,因此,如果您看到std::bind ,便知道您在看什么。 而如果您使用lambda,則必須查看lambda實現以確認其功能。

最后,C ++並不僅僅因為某些其他功能可以完成其工作而棄用某些東西。 不建議使用auto_ptr ,因為使用它具有內在的危險 ,並且存在非危險的替代方法。

您可以使用std::bind創建多態對象,而lambdas則無法實現,即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;    
}

我將其創建不是一個好的示例示例,而是一個難題 ,但是它確實演示了多態調用包裝器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM