We are programming a logging library that keeps itself in a .hpp file. We would like to include <tr1/unordered_map>
(if the compiler supports TR1,) or the standard <map>
otherwise. Is there a standard way of checking at compile time if tr1 is available or not?
I was thinking that the same way that the "__cplusplus
" define symbol is present, there could have been defined a "__cxx__tr1
" or something like that. I haven't seen that in the drafts for TR1, so I assume it is not present, but I wanted to ask first just in case.
As a note, if those defines don't exist, it wouldn't be a bad idea to include them in proposals themselves.
If you are using any configuration tools like autotools you may try to write a test like:
AC_CHECK_HEADER(tr1/unordered_map,[AC_DEFINE([HAVE_TR1],[],["Have tr1"])],[])
AC_CHECK_HEADER(unordered_map,[AC_DEFINE([HAVE_CXX0X],[],["Have C++0x"])],[])
And then use these defines in your code.
Generally speaking __cplusplus
macro should give you standard version number, but there is no compiler that gives you 100% standard implementation... Thus write configure macros.
Unfortunately this is only quite reliable way to check such things unless you want to write 1001 #ifdef
for each compiler (what boost does)
And then:
#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 has:
#define __GXX_EXPERIMENTAL_CXX0X__ 1
But, this is obviously not standard.
See ISO C++ (WG21) paper N1575. This paper has been dropped from TR1, with no replacement. So there is no official way to detect TR1.
One library I deal with needs to use some classes that got added to TR1 from Boost, preferring TR1 if available. The solution (being a Unix-based library) is to shove the checks into the configure script.
So in other words, no, nothing portable that I know of. That said, if you're on Unix, the configure script checks work well enough.
Assuming one is using VS2010, or any suite that has TR1 available, what would happen if one were to do
#include "boost/tr1/unordered_map.hpp"
...
std::tr1::unordered_map< ... > uMap;
What would be the type of uMap
be?
来源:https://stackoverflow.com/questions/724465/how-to-check-for-tr1-while-compiling