When should I use std::bind?

前端 未结 2 735
广开言路
广开言路 2020-12-24 06:00

Every time I need to use std::bind, I end up using a lambda instead. So when should I use std::bind? I just finished removing it from one codebase,

相关标签:
2条回答
  • 2020-12-24 06:03

    Here's something you can't do with a lambda:

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

    Lambdas can't capture move-only types; they can only capture values by copy or by lvalue reference. Though admittedly this is a temporary issue that's being actively resolved for C++14 ;)

    "Simpler and clearer" is a matter of opinion. For simple binding cases, bind can take a lot less typing. bind also is focused solely on function binding, so if you see std::bind, you know what you're looking at. Whereas if you use a lambda, you have to look at the lambda implementation to be certain of what it does.

    Lastly, C++ does not deprecate things just because some other feature can do what it does. auto_ptr was deprecated because it is inherently dangerous to use, and there is a non-dangerous alternative.

    0 讨论(0)
  • 2020-12-24 06:28

    You can create polymorphic objects with std::bind which you can't with lambdas, i.e. the call wrapper returned by std::bind can be invoked with different argument types:

    #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;    
    }
    

    I created this as a puzzle not an example of good code, but it does demonstrate polymorphic call wrappers.

    0 讨论(0)
提交回复
热议问题