Search code examples
c++visual-c++gcctr1

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!


Solution

  • 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>
    
    #ifdef HAVE_TR1_SUBDIR
    #  define TR1IFY(arg) tr1/arg
    #else
    #  define TR1IFY(arg) arg
    #endif
    
    #define TR1INCLUDE(arg) QUOTE(TR1IFY(arg))
    
    #endif
    

    Now I can just write my programs like this:

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