문제

우리는 .hpp 파일로 유지되는 로깅 라이브러리를 프로그래밍하고 있습니다. 우리는 포함하고 싶습니다 <tr1/unordered_map> (컴파일러가 TR1을 지원하는 경우) 또는 표준 <map> 그렇지 않으면. TR1을 사용할 수 있는지 여부에 관계없이 컴파일 시간에 표준 점검 방법이 있습니까?

나는 같은 방식으로 "__cplusplus"정의 기호가 존재하고 정의 될 수 있습니다."__cxx__tr1"또는 그런 것. TR1의 초안에서 그것을 보지 못했기 때문에 그것이 존재하지 않는다고 생각하지만, 만일을 대비하여 먼저 물어보고 싶었습니다.

참고로, 그러한 정의가 존재하지 않는다면 제안 자체에 포함시키는 것은 나쁜 생각이 아닙니다.

도움이 되었습니까?

해결책

Autotools와 같은 구성 도구를 사용하는 경우 다음과 같은 테스트를 작성하려고 할 수 있습니다.

AC_CHECK_HEADER(tr1/unordered_map,[AC_DEFINE([HAVE_TR1],[],["Have tr1"])],[])
AC_CHECK_HEADER(unordered_map,[AC_DEFINE([HAVE_CXX0X],[],["Have C++0x"])],[])

그런 다음 코드에서 이러한 정의를 사용하십시오.

일반적으로 말하면 __cplusplus 매크로는 표준 버전 번호를 제공해야하지만 100% 표준 구현을 제공하는 컴파일러는 없습니다. 따라서 MACROS를 작성하십시오.

불행히도 이것은 1001을 쓰고 싶지 않다면 그러한 것을 확인하는 매우 신뢰할 수있는 방법입니다. #ifdef 각 컴파일러에 대해 (부스트하는 것)

그리고:

#include "config.h"
#ifdef  HAVE_CXX0X
#  include <unordered_map>
   typedef std::unordered_map<foo,bar> my_map;
#elif HAVE_TR1
#  include <tr1/unordered_map>
   typedef std::tr1::unordered_map<foo,bar> my_map;
#else
#  include <map>
   typedef std::map<foo,bar> my_map;
#endif

다른 팁

GCC-4.3은 다음과 같습니다.

#define __GXX_EXPERIMENTAL_CXX0X__ 1

그러나 이것은 분명히 표준이 아닙니다.

ISO C ++ (WG21) 용지를 참조하십시오 N1575. 이 논문은 교체없이 TR1에서 떨어졌습니다. 따라서 TR1을 감지하는 공식적인 방법은 없습니다.

내가 다루는 하나의 라이브러리는 Boost에서 TR1에 추가 된 일부 클래스를 사용해야하며 가능한 경우 TR1을 선호합니다. 솔루션 (UNIX 기반 라이브러리)은 검사를 구성 스크립트로 밀어 넣는 것입니다.

다시 말해, 내가 아는 휴대용은 없습니다. 즉, UNIX에 있다면 구성 스크립트 확인이 충분히 잘 작동합니다.

하나가 VS2010을 사용하고 있다고 가정하거나 TR1을 사용할 수있는 스위트

#include "boost/tr1/unordered_map.hpp"
...
std::tr1::unordered_map< ... > uMap;

의 유형은 무엇입니까? uMap 이다?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top