Если вы используете какие-либо инструменты настройки, такие как 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% стандартную реализацию ... Таким образом, пишите макросы configure.
К сожалению, это только достаточно надежный способ проверить такие вещи, если вы не хотите писать 1001 #ifdef
для каждого компилятора (что делает boost)
А потом:
#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