Kerrek SB Kerrek SB - 1 year ago 47
C++ Question

Using TR1 libraries in GCC and MSVC

I would like to use the TR1 libraries that ship with modern versions of GCC and MSVC, but there are subtle differences: in GCC, I have to say

#include <tr1/memory>
std::tr1::shared_ptr<int> X;

while in MSVC I have to say

#include <memory>
std::shared_ptr<int> X;

I have two questions: 1) Does MSVC automatically operate in C++0x-mode (equivalent to GCC's std=c++0x), or does it also work in C++98/03 mode by default? 2) How can I unify the includes and namespaces? I was thinking about a preprocessor macro of the sort "INCLUDE_TR1(memory)" or something like that.

To clarify, I want to use the traditional, standard C++98/03; not C++0x (otherwise there'd be no problem).

I'd be most grateful for any suggestions!

Answer Source

OK, after having several inconsistent and unsurmountable problems with Boost.TR1, especially when trying to use GCC's native TR1 libraries, I decided to ditch Boost entirely and use a small #define workaround. Here is my "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>

#  define TR1IFY(arg) tr1/arg
#  define TR1IFY(arg) arg

#define TR1INCLUDE(arg) QUOTE(TR1IFY(arg))


Now I can just write my programs like this:

#include "tr1.h"
#include TR1INCLUDE(unordered_map)