Использование библиотек TR1 в GCC и MSVC - PullRequest
10 голосов
/ 10 мая 2011

Я хотел бы использовать библиотеки 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 ]

4 голосов
/ 10 мая 2011

VC ++ 2010 всегда работает в режиме C ++ 0x, но классы существуют в пространствах имен std и std::tr1.Вам нужно будет определить компилятор с помощью #if _MSC_VER, чтобы выбрать, какие заголовки включить (см. этот ответ ).

Библиотека Boost.TR1 может автоматическивключите заголовки вашего компилятора и заполните любую недостающую функциональность, используя Boost.Это может помочь.

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

ОК, после нескольких противоречивых и непреодолимых проблем с Boost.TR1, особенно при попытке использовать собственные библиотеки GCC TR1, я решил полностью отказаться от 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)
1 голос
/ 10 мая 2011

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

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

...