Pergunta

Estamos programando uma biblioteca de registro que se mantém em um arquivo .hpp. Gostaríamos de incluir <tr1/unordered_map> (se o compilador suporta TR1,) ou o <map> padrão contrário. Existe uma maneira padrão de verificação em tempo de compilação se tr1 está disponível ou não?

Eu estava pensando que da mesma forma que o "__cplusplus" definir símbolo está presente, não poderia ter sido definido um "__cxx__tr1" ou algo parecido. Eu não vi que nos rascunhos para TR1, por isso suponho que não está presente, mas eu queria perguntar primeiro para o caso.

Como uma nota, se não existirem esses define, não seria uma má idéia para incluí-los em propostas si mesmos.

Foi útil?

Solução

Se você estiver usando quaisquer ferramentas de configuração como autotools você pode tentar escrever um teste como:

AC_CHECK_HEADER(tr1/unordered_map,[AC_DEFINE([HAVE_TR1],[],["Have tr1"])],[])
AC_CHECK_HEADER(unordered_map,[AC_DEFINE([HAVE_CXX0X],[],["Have C++0x"])],[])

E, em seguida, usar essas define em seu código.

De um modo geral __cplusplus macro deve dar-lhe o número da versão standard, mas não há compilador que lhe dá 100% implementação padrão ... macros do configure Assim escrita.

Infelizmente esta é única maneira bastante confiável para verificar essas coisas a menos que você quer escrever 1001 #ifdef para cada compilador (o impulso faz)

E, em seguida:

#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

Outras dicas

GCC-4.3 tem:

#define __GXX_EXPERIMENTAL_CXX0X__ 1

Mas, isso é, obviamente, não padrão.

Ver ISO C ++ (WG21) papel N1575 . Este artigo foi retirado TR1, sem substituição. Portanto, não há nenhuma maneira oficial para detectar TR1.

Um negócio que eu biblioteca com as necessidades de usar algumas classes que foi adicionado a TR1 de impulso, preferindo TR1, se disponível. A solução (sendo uma biblioteca baseada em Unix) é empurrar as verificações para o script configure.

Assim, em outras palavras, não, nada portátil que eu saiba. Dito isto, se você estiver em Unix, os controlos de script configure funcionar bem o suficiente.

Assumindo que a pessoa está usando VS2010, ou qualquer suíte que tem TR1 disponíveis, o que aconteceria se alguém fosse fazer

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

Qual seria o tipo de uMap ser?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top