C ++ 11 std :: bind와 boost :: bind의 차이점
둘 사이에 차이점이 있습니까? 아니면 코드에서 boost::bind
by의 모든 항목을 교체 std::bind
하여 Boost에 대한 의존성을 제거해도 안전 합니까?
boost::bind
관계 연산자를 오버로드했다 ,std::bind
하지 않습니다.boost::bind
기본이 아닌 호출 규칙을 지원 ,std::bind
(확장으로이를 제공 할 수 있습니다 표준 라이브러리 구현)을 보장 할 수 없습니다.boost::bind
중첩 된 바인드 표현식 ( )에 대한 열망 평가 를 방지 할 수있는 직접적인 메커니즘을 제공합니다 . (즉, 원하는 경우 with 를 사용 하거나 자체적으로 사소하게 다시 구현할 수 있습니다.)boost::protect
std::bind
boost::protect
std::bind
std::bind
eager 평가 ( : [func.bind.isbind] / 1, [func.bind.bind] / 10) 를 강제 하기 위해 사용자 정의 함수를 중첩 된 바인드 표현식으로 처리 할 수있는 직접적인 메커니즘을 제공합니다 .std::is_bind_expression
boost::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::bind
c ++ 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::placeholders
가 std::placeholders::_1
아닌 in에 있습니다.
네임 스페이스를 stdph로 별칭을 지정합니다.
namespace stdph=std::placeholders;
그 외에도 C ++ 11로 업데이트하는 데 문제가 없었습니다.
참고URL : https://stackoverflow.com/questions/10555566/difference-between-c11-stdbind-and-boostbind
'developer tip' 카테고리의 다른 글
CSS를 사용하여 div의 높이를 너비에 비례하여 조정할 수 있습니까? (0) | 2020.11.14 |
---|---|
PHP 루트 디렉토리에 txt 파일 생성 및 저장 (0) | 2020.11.14 |
파이썬 목록과 혼동 : 그것들이 반복자입니까? (0) | 2020.11.14 |
ExecutorService를 Java의 데몬으로 전환 (0) | 2020.11.13 |
주어진 문자열을 식별하는 방법은 16 진수 색상 형식입니다. (0) | 2020.11.13 |