Как проверить наличие TR1 при компиляции?


Мы программируем библиотеку журналов, которая сохраняет себя в a .файл ГЭС. Мы хотели бы включить <tr1/unordered_map> (если компилятор поддерживает TR1,) или Стандарт <map> в противном случае. Существует ли стандартный способ проверки во время компиляции, доступен ли tr1 или нет?

Я думал, что так же, как присутствует символ определения "__cplusplus", можно было бы определить "__cxx__tr1" или что-то в этом роде. Я не видел этого в черновиках для TR1, поэтому предполагаю, что его нет, но я хотел бы сначала спроси на всякий случай.

В качестве примечания, если эти определения не существуют, было бы неплохо включить их в сами предложения.

5 5

5 ответов:

Если вы используете какие-либо инструменты настройки, такие как 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% стандартную реализацию... Таким образом пишем конфигурируем макросы.

К сожалению, это единственный достаточно надежный способ проверить такие вещи, если вы не хотите написать 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 не существует.

Одна библиотека, с которой я имею дело, должна использовать некоторые классы, добавленные в TR1 из Boost, предпочитая TR1, если он доступен. Решение (будучи библиотекой на базе Unix)состоит в том, чтобы засунуть проверки в сценарий configure.

Другими словами, нет, ничего портативного, насколько мне известно. Тем не менее, если вы находитесь на Unix, проверки сценария configure работают достаточно хорошо.

Предполагая, что вы используете VS2010 или любой набор, который имеет TR1, что произойдет, если вы сделаете

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

Каким будет тип uMap?