2012-06-04 2 views
8

질문의 제목이 올바른지 확신 할 수 없습니다. 여기에 문제가있다. 일부 C++ 11 라이브러리 기능을 사용하는 라이브러리를 작성 중입니다. 아직 모든 구현이 이러한 라이브러리를 지원하지는 않기 때문에 이식성 문제가 있습니다. 여기서 어떤 라이브러리가 문제가되는지는 중요하지 않습니다. 한 가지 해결책은 이미 많은 C++ 11 라이브러리를 제공하는 boost를 사용하는 것입니다. 그래서 내 해결 방법은 매크로를 정의하는 것입니다, 예를 들어 USE_CXX11, 그리고 새로운 네임 스페이스를 정의 internal라고 정의하고 매크로에 의존하여이 내부 네임 스페이스에 이름을 도입하십시오. 예를 들어, foo이라는 이름의 C++ 라이브러리 <foo>을 사용해야하며 이는 <boost/foo/foo.hpp>에서도 가능합니다. 내가하는 일은부스트/C++ 용 C++ 래퍼 11

#ifdef USE_CXX11 
#include <foo> 
#else 
#include <boost/foo/foo.hpp> 
#endif 

namespace internal { 
#ifdef USE_CXX11 
using std::foo; 
#else 
using boost::foo::foo; 
#endif 
} 

이며, 라이브러리의 나머지 부분에서 난 단지 internal::foo를 사용합니다. 이 라이브러리를 사용하는 제 3 자 코드는 작동하는 C++ 11 구현이 있는지 또는 부스트 만 사용할 수 있는지 나타내는 적절한 매크로를 정의 할 수 있습니다. 그리고 내 라이브러리는 올바른 헤더와 네임 스페이스를 픽업합니다. 이것은 지금까지 작동합니다. 희망을 잘 설명해 주었으면합니다.

그러나 위의 해결책은 나에게는 매우 못 생겼습니다. 이런 종류의 일에 더 좋은 연습이 있습니까? 아니면이 접근법이 작동하지 않을 수있는 상황이 있습니까?

+1

체크 아웃 Boost.Algorithms 라이브러리 (곧 1.50 릴리스의 새로운 기능) ** Boost.TR1 ** –

+3

는 부스트에, 그리고 당신이 지원해야하는 경우 구식 컴파일러는 Boost에서 직접 사용하십시오. –

+0

부스트를 사용하지 않는 이유는 무엇입니까? – fbafelipe

답변

5

당신의 해결책은 나에게 잘 들립니다. Boost와 C++ 11 인터페이스 및/또는 구현이 다른 경우에만 문제가 발생할 것입니다 (Chet 언급).

사실, 나는 어떻게 그

namespace boost { namespace algorithm { 
#if __cplusplus >= 201103L 
using std::find_if_not;  // Section 25.2.5 
#else 
template<typename InputIterator, typename Predicate> 
InputIterator find_if_not (InputIterator first, InputIterator last, Predicate p) 
{ 
    for (; first != last; ++first) 
     if (!p(*first)) 
      break; 
    return first; 
} 
#endif 
}} 
2

실용적인 해결책으로 보이지 않습니다. 클래스간에 조건부로 전환하면 동일한 서명과 의미를 갖는 멤버 함수에만 사용이 제한됩니다. 또한 표준 라이브러리에 대한 액세스를 리디렉션하므로 많은 개발자가 부 자연스럽게 느낄 수 있습니다.

유용성이 C++ 03과 C++ 11 사이에 문제가된다면 Boost를 사용하여 모든 작업을 수행해야합니다. C++ 11이 유일한 타겟이라면 다양한 컴파일러가 어떤 언어와 라이브러리 기능을 지원하는지 평가하는 것이 더 성공적 일 것입니다. 잘 지원되고 버그가없는 것으로 간주되는 것을 선택하십시오. 그 밖의 모든 경우에는 Boost와 리팩토링을 사용하여 C++ 11 라이브러리 기능을 더 많이 지원해야합니다. 라이브러리를 전환하는 것보다는 탠덤으로 라이브러리를 사용하는 것이 훨씬 낫습니다.

상태 페이지 GCC's C++ Standard Library implementation부터 시작할 수 있습니다.