我目前正在编写一个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/