developer tip

C ++ 11 std :: bind와 boost :: bind의 차이점

copycodes 2020. 11. 14. 10:44
반응형

C ++ 11 std :: bind와 boost :: bind의 차이점


둘 사이에 차이점이 있습니까? 아니면 코드에서 boost::bindby의 모든 항목을 교체 std::bind하여 Boost에 대한 의존성을 제거해도 안전 합니까?


  • boost::bind 관계 연산자를 오버로드했다 , std::bind하지 않습니다.

  • boost::bind 기본이 아닌 호출 규칙을 지원 , std::bind(확장으로이를 제공 할 수 있습니다 표준 라이브러리 구현)을 보장 할 수 없습니다.

  • boost::bind중첩 된 바인드 표현식 ( )에 대한 열망 평가 방지 할 수있는 직접적인 메커니즘을 제공합니다 . (즉, 원하는 경우 with 를 사용 하거나 자체적으로 사소하게 다시 구현할 수 있습니다.)boost::protectstd::bindboost::protectstd::bind

  • std::bindeager 평가 ( : [func.bind.isbind] / 1, [func.bind.bind] / 10) 강제 하기 위해 사용자 정의 함수를 중첩 된 바인드 표현식으로 처리 할 수있는 직접적인 메커니즘을 제공합니다 .std::is_bind_expressionboost::bind


다른 답변에 인용 된 몇 가지 차이점 외에도 다음과 같은 두 가지 차이점이 있습니다.

  • boost::bind일부 상황에서 오버로드 된 함수 이름을 처리하는 것처럼 보이지만 std::bind동일한 방식으로 처리하지 않습니다. C ++ 11 FAQ 참조

(gcc 4.7.2 사용, lib 버전 1_54 부스트)

void foo(){}
void foo(int i){}

auto badstd1 = std::bind(foo);  
//compile error: no matching function for call to bind(<unresolved overloaded function type>)
auto badstd2 = std::bind(foo, 1); 
//compile error: no matching function for call to bind(<unresolved overloaded function type>)
auto std1 = std::bind(static_cast<void(*)()>(foo)); //compiles ok
auto std2 = std::bind(static_cast<void(*)(int)>(foo), 1); //compiles ok
auto boost1 = boost::bind(foo, 1); //compiles ok
auto boost2 = boost::bind(foo); //compiles ok

따라서 단순히 모두 boost::bind으로 std::bind바꾸면 빌드가 손상 될 수 있습니다.

  • std::bindc ++ 11 람다 유형에 원활하게 바인딩 할 수있는 반면 boost::bind, 부스트 1.54에서는 사용자의 입력이 필요한 것으로 보입니다 (return_type이 정의되지 않은 경우). 부스트 문서 보기

(gcc 4.7.2 사용, lib 버전 1_54 부스트)

auto fun = [](int i) { return i;};
auto stdbound = std::bind(fun, std::placeholders::_1);
stdbound(1);

auto boostboundNaive = boost::bind(fun, _1);  //compile error.
// error: no type named ‘result_type’ ...
auto boostbound1 = boost::bind<int>(fun, _1); //ok
boostbound1(1);
auto boostbound2 = boost::bind(boost::type<int>(), fun, _1); //ok
boostbound2(1);

따라서 단순히 모두 std::bind으로 boost::bind바꾸면 빌드도 손상 될 수 있습니다.


위에 나열된 것 외에도 boost :: bind에는 boost :: bind를 스마트 포인터와 통합 할 수있는 get_pointer () 함수가 있습니다. ATL :: CComPtr 등 http://www.boost.org/doc/libs/1_49_0/libs/bind/mem_fn.html#get_pointer

결과적으로 boost :: bind를 사용하면 weak_ptr도 바인딩 할 수 있습니다. http://lists.boost.org/Archives/boost/2012/01/189529.php


완전한 답은 없지만 std::bind매개 변수 목록보다는 가변 템플릿을 사용할 것입니다.

자리 표시자는 전역 네임 스페이스 std::placeholdersstd::placeholders::_1아닌 in에 있습니다.

네임 스페이스를 stdph로 별칭을 지정합니다.

namespace stdph=std::placeholders;

그 외에도 C ++ 11로 업데이트하는 데 문제가 없었습니다.

참고URL : https://stackoverflow.com/questions/10555566/difference-between-c11-stdbind-and-boostbind

반응형