我正在将线程库的一部分从 C++03 移动到 C++11,但我想让它与 Boost 兼容,作为没有 C++11 编译器的用户的一个选项。由于 C++11 STL 和 Boost 1.54 基本上具有相同的接口(至少对于我感兴趣的部分而言),因此最好有这样的东西:
#ifdef USING_BOOST
#define NAMESPACE boost
#else
#define NAMESPACE std
#endif
typedef NAMESPACE::mutex MyLibrary::Mutex;
typedef NAMESPACE::condition_variable MyLibrary::ConditionVariable;
...
问题来自模板,例如unique_lock。更好的方法可能是这样的:
#define TYPEDEF(WHAT, AS) typedef LIBPREFIX::WHAT AS
#define TYPEDEF_T(WHAT, AS) \
template <typename T> \
struct AS \
{ \
typedef LIBPREFIX::WHAT<T> type; \
};
TYPEDEF( thread, Thread );
TYPEDEF( mutex, Mutex );
TYPEDEF( condition_variable, ConditionVariable );
TYPEDEF_T( lock_guard, LockGuard );
TYPEDEF_T( unique_lock, UniqueLock );
TYPEDEF_T( shared_ptr, SharedPtr );
但是我必须以这种方式使用它:
LockGuard<Mutex>::type lock(...);
例如,我不喜欢一直写 ::type。
另外,我想覆盖 make_shared 函数,即映射如下:
MyLibrary::MakeShared<T> --> NAMESPACE::make_shared<T>
其中 NAMESPACE 是“std”或“boost”。我想像
#define USING(WHAT) using NAMESPACE::WHAT
USING( make_shared );
不是一个可行的选择......对吧?
覆盖整个 boost 命名空间不是解决方案,因为 Boost 的其他部分可以在代码中使用。实现这一目标的最佳方法是什么?
谢谢!