Использование библиотек TR1 в GCC и MSVC
Я хотел бы использовать библиотеки TR1, которые поставляются с современными версиями GCC и MSVC, но есть небольшие различия: в GCC я должен сказать,
#include <tr1/memory>
std::tr1::shared_ptr<int> X;
в то время как в MSVC я должен сказать
#include <memory>
std::shared_ptr<int> X;
У меня есть два вопроса: 1) MSVC автоматически работает в режиме C++0x (эквивалентно std= C++0x GCC), или он также работает в режиме C++98/03 по умолчанию? 2) Как мне объединить пространства включений и имен? Я думал о макросе препроцессора типа "INCLUDE_TR1(memory)" или о чем-то подобном.
Чтобы уточнить, я хочу использовать традиционный, стандартный C++98/03; не C++0x (иначе проблем не было бы).
Буду очень признателен за любые предложения!
4 ответа
Хорошо, после нескольких противоречивых и непреодолимых проблем с Boost.TR1, особенно при попытке использовать собственные библиотеки TR1 GCC, я решил полностью отказаться от Boost и использовать небольшой обходной путь #define. Вот мой "tr1.h":
#ifndef _TR1_INCLUDE_H
#define _TR1_INCLUDE_H
/** Usage: #include TR1INCLUDE(unordered_map)
**
** Configuration: Define HAVE_TR1_SUBDIR if you need #include <tr1/unordered_map>; otherwise we take #include <unordered_map>.
**
**/
#define QUOTE(arg) <arg>
#ifdef HAVE_TR1_SUBDIR
# define TR1IFY(arg) tr1/arg
#else
# define TR1IFY(arg) arg
#endif
#define TR1INCLUDE(arg) QUOTE(TR1IFY(arg))
#endif
Теперь я могу написать свои программы вот так:
#include "tr1.h"
#include TR1INCLUDE(unordered_map)
VC++ 2010 всегда работает в режиме C++0x, но классы существуют как в std
а также std::tr1
Пространства имен. Вы должны будете обнаружить компилятор с #if _MSC_VER
выбрать, какие заголовки включить (см. этот ответ).
Библиотека Boost.TR1 может автоматически включать заголовки вашего компилятора и заполнять любые недостающие функции с помощью Boost. Это может помочь.
- VC++ 2010 работает только в режиме C++0x; В предыдущих версиях не было поддержки C++0x. Тем не менее, большая часть стандартной библиотеки в VC++ 2010 по-прежнему основана на TR1 (например,
std::result_of<>
использует протокол TR1 result_of вместо того, чтобы бытьdecltype
-основан); на самом деле, большая часть стандартной библиотеки в VC++ 2010 фактически не определена в пространстве именstd
, а точнее в пространстве именstd::tr1
и вытащил в пространство именstd
с использованием директивы. - Используйте Boost. TR1 - будет
#include
соответствующие заголовки в соответствии с вашей платформой, или если ваша платформа не имеет поддержки TR1,#include
соответствующие реализации Boost и вытянуть их в пространство именstd::tr1
с использованием объявлений.
Различные версии MSVC имеют функции, которые они имеют. Нет способа их включить или выключить.
Некоторые из них также могут иметь версии некоторых функций как tr1, так и std. С немного другой семантикой!