Как проверить TR1 во время компиляции? - PullRequest
5 голосов
/ 07 апреля 2009

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

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

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

Ответы [ 5 ]

2 голосов
/ 07 апреля 2009

См. Документ ISO C ++ (WG21) N1575 . Этот документ был снят с TR1, без замены. Так что нет официального способа обнаружить TR1.

2 голосов
/ 07 апреля 2009

Если вы используете какие-либо инструменты настройки, такие как 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
2 голосов
/ 07 апреля 2009

GCC-4.3 имеет:

#define __GXX_EXPERIMENTAL_CXX0X__ 1

Но это явно не стандарт.

1 голос
/ 07 апреля 2009

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

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

0 голосов
/ 14 марта 2011

Если предположить, что кто-то использует VS2010 или любой набор, который имеет TR1, что произойдет, если один из них сделает

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

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

...