Использование библиотек 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. Это может помочь.

  1. VC++ 2010 работает только в режиме C++0x; В предыдущих версиях не было поддержки C++0x. Тем не менее, большая часть стандартной библиотеки в VC++ 2010 по-прежнему основана на TR1 (например, std::result_of<> использует протокол TR1 result_of вместо того, чтобы быть decltype-основан); на самом деле, большая часть стандартной библиотеки в VC++ 2010 фактически не определена в пространстве имен std, а точнее в пространстве имен std::tr1 и вытащил в пространство имен std с использованием директивы.
  2. Используйте Boost. TR1 - будет #include соответствующие заголовки в соответствии с вашей платформой, или если ваша платформа не имеет поддержки TR1, #include соответствующие реализации Boost и вытянуть их в пространство имен std::tr1 с использованием объявлений.

Различные версии MSVC имеют функции, которые они имеют. Нет способа их включить или выключить.

Некоторые из них также могут иметь версии некоторых функций как tr1, так и std. С немного другой семантикой!

Другие вопросы по тегам