首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >抽象线程相关的STL和Boost类型和方法

抽象线程相关的STL和Boost类型和方法
EN

Stack Overflow用户
提问于 2013-09-09 18:07:49
回答 3查看 136关注 0票数 1

我正在将线程库的一部分从C++03迁移到C++11,但我想让它与Boost兼容,作为没有C++11编译器的用户的一个选择。由于C++11 STL和Boost 1.54基本上具有相同的接口(至少对于我感兴趣的部分是这样的),所以最好能有这样的接口:

代码语言:javascript
复制
#ifdef USING_BOOST
#define NAMESPACE boost
#else
#define NAMESPACE std
#endif

typedef NAMESPACE::mutex MyLibrary::Mutex;
typedef NAMESPACE::condition_variable MyLibrary::ConditionVariable;
...

这个问题来自于模板,例如unique_lock。一种更好的方法可能是:

代码语言:javascript
复制
#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 );

但是,我必须这样使用它:

代码语言:javascript
复制
LockGuard<Mutex>::type lock(...);

例如,我不喜欢一直写::type。

此外,我还想覆盖make_shared函数,即按如下方式映射它:

代码语言:javascript
复制
MyLibrary::MakeShared<T> --> NAMESPACE::make_shared<T>

其中命名空间为'std‘或'boost’。我猜大概是这样的

代码语言:javascript
复制
#define USING(WHAT) using NAMESPACE::WHAT
USING( make_shared );

不是一个可行的选择。对吗?

覆盖整个boost名称空间不是一个解决方案,因为Boost的其他部分可以在代码中使用。实现这一目标的最佳方法是什么?

谢谢!

EN

回答 3

Stack Overflow用户

发布于 2013-09-09 18:25:11

您只需通过using声明将适当的名称导入到您的名称空间中:

代码语言:javascript
复制
namespace MyLibrary {

#ifdef USING_BOOST
  using boost::thread;
  using boost::unique_lock;
  using boost::make_shared;
#else
  using std::thread;
  using std::unique_lock;
  using std::make_shared;
#endif

}

这适用于所有名称:类、函数和模板。

票数 4
EN

Stack Overflow用户

发布于 2013-09-09 21:48:15

使用命名空间别名:

代码语言:javascript
复制
#ifdef USING_BOOST
namespace mt = boost;
#else
namespace mt = std;
#endif

现在您可以引用mt::condition_variable,编译器将从适当的名称空间中看到该名称空间。

票数 1
EN

Stack Overflow用户

发布于 2013-09-09 18:18:08

最简单的选择不是继续使用boost吗?这将避免为自己做不必要的工作。如果做不到这一点,为什么不只为您想要从一个或另一个库中选择的类型使用types:

代码语言:javascript
复制
namespace foo {
#ifdef USING_BOOST
    typedef boost::mutex       mutex;
    typedef boost::scoped_lock mutex_lock;
#else
    typedef std::mutex       mutex;
    typedef std::unique_lock mutex_lock;
#endif
}

foo::mutex myMutex;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18695894

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档