Вопрос

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

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

Другие советы

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 быть?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top