2011-01-13 2 views
29

나는 처음에는 그것들이 모두 같다고 생각했지만 잘못되었다. 그럼 누구든지이 세 가지의 차이점을 간략하게 설명 할 수 있습니까?std, tr1 및 boost (네임 스페이스 및/또는 라이브러리)의 차이점은 무엇입니까?

  1. std::bind (최신 일, C++의 차세대)
  2. std::tr1::bind (구, C의 확장 ++ 표준)
  3. boost::bind (완전히 분리 된 라이브러리)

또는 std::shared_ptr, std::tr1::shared_ptr : 예를 들어, , 및 boost::shared_ptr, ... 등

업데이트

bind, shared_ptr은 내 질문을 명확히하는 데 도움이되는 예제입니다. 내 의도는이 세 가지 네임 스페이스 간의 일반적인 차이점을 이해하는 것이 었습니다. 세 개의 네임 스페이스 모두에 존재하는 라이브러리가 여러 개 있으며, shared_ptr은 물론 bind이 하나의 예입니다.

어떤 이름 공간을 사용해야합니까? 저는 개인적으로 C++ (C++ 0x)의 다음 표준이 될 것이므로 std::에서 라이브러리를 선호합니다.

+4

변경 질문 - "bind"를 추가하십시오. 일반적으로 라이브러리 간의 차이점이 있습니다. – peenut

+0

@peenut, 그는 * 일반적인 차이점에 대해 분명히 묻습니다. –

+0

당신이 명확히해야합니다. 실제로'boost :: vector' 또는'boost :: cout'이 있다고 생각합니까? * 실제로 * 알고 싶은 것이 있습니까? –

답변

28

1 - std::bind은 표준 이름입니다. 이것은 C++ 11 호환 라이브러리에 사용하는 이름입니다. 모두 libraries in standardized C++의 목록입니다.

2 - std::tr1::bind은 C++ 기술 보고서 ​​1 네임 스페이스입니다. C++ 03과 C++ 11 사이에는 C++ Technical Report 1이 있었으며 추가 라이브러리와 향상된 기능을 제안했습니다. 이들 대부분은 이미 Boost에 존재했으며,이 라이브러리 변경 중 일부는 <regex><functional> (std::bind 포함)과 같은 C++ 11 표준에서 채택되었습니다. std::tr1 네임 스페이스는 std 네임 스페이스에서 표준화 된 모든 라이브러리와 달리 라이브러리를 진행중인 상태로 차별화하는 데 사용되었습니다.

3 - boost::bindBoost 라이브러리를 사용하는 경우 boost 네임 스페이스에 bind입니다. Boost는 TR1에있는 것 이상이고 C++ 11의 표준 라이브러리에있는 것보다 훨씬 더 포괄적입니다. 목록 모든 libraries in Boost as of 1.52.0

TR1에 무슨 대부분의 표준화와 C++ (11) std 네임 스페이스에 있고, C++ (11) 스레딩 지원 등의 부스트 구조에서 적응 된 TR1에 언급 된 것보다 더 많은 라이브러리를 포함하고있다 <thread>에 정의되어 있습니다.

사용할 수있는 항목과 현재 사용할 수있는 네임 스페이스를 정의하는 부분은 컴파일러에 따라 다릅니다. 기억하지는 못하지만 최근의 GCC-g ++ 구현은 새로운 C++ 11 라이브러리에 std 네임 스페이스를 사용하기 시작했지만이를 활성화하기 위해 다른 컴파일러 플래그가 필요할 수도 있습니다. 그래도 그들은 std::tr1 네임 스페이스를 지원합니다. Visual C++ 2010은 이전에 std::tr1에 있던 내용을 std 네임 스페이스로 옮겼지만 Visual C++ 2008은 여전히 ​​std::tr1을 사용했습니다.

+1

@VJo, 그렇습니다.하지만 C++ 1x가 될 것 같지 않습니다. p – birryree

+4

C++이 될 것입니다. 0C – ybungalobill

+1

@ybungalobill +1은 나를 웃게합니다. :) – birryree

2

다음 C++ 표준의 큰 부분이 실제로 Boost에서 상속되었으므로 큰 차이를 만들어서는 안됩니다. 따라서 std::bind이 있고 다른 컴파일러와 호환 될 필요는 없다면 그냥 사용하십시오.boost::bind은 컴파일러와 무관 한 경우에 적합합니다. 내 생각에 std::tr1::bind 다른 두 가지 이점을 전혀 사용할 수없는 경우 : C++ 03 및 C++ 0x 둘 다 비표준 있다고 생각합니다.

+1

정의는 boost에서 상속 받았지만 코드 구현은 아니며 tr1 :: bind에서 끔찍한 버그를 발견했습니다. 2009 년에는 ref()를 제대로 전달하지 못했습니다. 내 생각에 부스트 코드를 STL 구현에 복사 할 수는 없으며 오랜 기간에 걸쳐 부스트 코드를 피어 검토하고 테스트 한 결과 열등한 것으로 보입니다. 따라서 개인적으로 선택의 폭이 넓어 졌을 것입니다. – CashCow

+0

@CashCow : 귀하의 조언에 감사드립니다. 그러나 라이브러리에 대해 어떻게 std :: VC++에서? 라이브러리를 늘리는 것보다 더 나빠요? 예를 들어 boost :: regex vs std :: regex? – Chan

9

은 바인드 (또는 문제에 대한 모든 다른)를 사용하려면, 좋은 기능, 여기 네임 스페이스 이름 바꾸기입니다 예입니다

: 당신이되고 MyNamespace에 변경하면, 이제

namespace MyNamespace = boost; 

void DoSomething(void) 
{ 
    MyNamespace::bind(...); 
} 

namespace MyNamespace = std::tr1; 

다음은 std::tr1::bind입니다.

namespace MyNamespace = std::tr1; 

void DoSomething(void) 
{ 
    MyNamespace::bind(...); 
} 

당신은, 물론, 당신은 쉽게 당신이 표준 : 직접 결코 별칭을 사용해야합니다 TR1을 원하는 알고있는 경우는, 미래에 네임 스페이스의 변경하려는 요소에 대한 MyNamespace에 사용해야합니다.

+0

아주 멋진 트릭을 가져 주셔서 감사합니다! – Chan

5

귀하는 귀하의 질문에 거의 대답했습니다. 난 그냥 예제를 복사/붙여 넣기하고 정확하게 귀하의 질문에 대답 할 수 있습니다. 두 가지만 실제로 확장이 필요하다는 것으로 나타납니다.

1) std ::가 tr1에 의해 확장 된 이유는 무엇입니까? TR1은 "기술 보고서 ​​1"이며 하위 그룹 중 하나에 의해 표준위원회에 제안 된 도서관 확장의 공식적인 첫 번째 집합입니다. 표준을 확장 한 것 이상입니다.

2) boost :: bind는 실제로 일부 시스템에서는 std :: bind와 다르게 동작합니다. MSVC 람다 표현식과 std :: bind가 표준이 아닌지 잘 모르겠다. 서로 매우 잘 동작하지 않는다. 어쩌면 다른 방법으로도, std :: bind보다는 boost :: bind를 사용하는 정책을 만들었 기 때문에 기억이 안납니다. 반환 값 템플릿 매개 변수는 종종 std::bind<type>(...)으로 지정했을 때 return_value<f>::type (또는 무엇이든) 오류가 발생하지 않도록 msvc의 std :: bind에서 무시됩니다. boost :: bind는 이미 정규 어휘에 포함 시켰기 때문에 행동의 정확한 차이를 알아 내지 못했습니다. 우리는 그것을 사용하는 방법을 알고있었습니다.

관련 문제