我目前正在编写一个C ++库,该库将需要与用于Linux的GCC和用于Solaris的Sun CC一起编译。为了提高性能,我创建了一些基于编译器选择不同标头的类。具有c ++ 0x或TR1或niether的GCC和Sun CC RogueWave或STLPort。我正在努力找出#ifdef的typedef的最佳方法,例如:

namespace project {

    #if defined(__GNUG__)
        #if defined(HAVE_CXXOX)
            #include <unorderd_map>
            typedef srd::unordered_map map;
        #elif defined(HAVE_TR1)
            #include <tr1/unordered_map>
            typedef std::tr1::unordered_map map;
        #else
            #include <map>
            typedef std::map map;
        #endif
    #elif defined(__SUNPROC_CC)
        #include <map>
        typedef std::map map;
    #endif

} //namespaces

最佳答案

这不能工作有两个原因:


标头必须包含在namespace project { ... }范围之外。 (如果标头仅包含模板和内联函数,则无论如何它都可以工作,但我不会指望它。)
typedef在模板上不起作用。有一种解决方法,您可以定义一个空的派生类。


所以也许是这样的:

#if defined(__GNUG__)
    #if defined(HAVE_CXXOX)
        #include <unordered_map>
        #define MAP std::unordered_map
    #elif defined(HAVE_TR1)
        #include <tr1/unordered_map>
        #define MAP std::tr1::unordered_map
    #else
        #include <map>
        #define MAP std::map
    #endif
#elif defined(__SUNPROC_CC)
    #include <map>
    #define MAP std::map
#endif

namespace myproject {
    template <class K, class V>
    class map : public MAP<K, V> {};
}

#undef MAP

关于c++ - 基于宏的C++ header 选择,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4510109/

10-13 08:28