抽象与线程相关的 STL 和 Boost 类型和方法
Abstracting thread-related STL and Boost types and methods
我正在将线程库的一部分从 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>
其中命名空间是"标准"或"提升"。我猜
像#define USING(WHAT) using NAMESPACE::WHAT
USING( make_shared );
不是一个可行的选择...右?
覆盖整个 boost 命名空间不是解决方案,因为 Boost 的其他部分可以在代码中使用。实现这一目标的最佳方法是什么?
谢谢!
您可以通过using
声明将适当的名称导入命名空间:
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
}
这适用于所有名称:类、函数和模板。
使用命名空间别名:
#ifdef USING_BOOST
namespace mt = boost;
#else
namespace mt = std;
#endif
现在您可以引用mt::condition_variable
编译器将看到来自相应命名空间的那个。
最简单的选择不是继续使用boost吗?这样可以避免为自己做不必要的工作。如果做不到这一点,为什么不只为你想要从一个库或另一个库选择的类型使用 typedef:
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;
相关文章:
- boost 是否有按特殊类型值编码状态"compact optional"?
- 像union_这样的 Boost.Geometry 操作如何处理浮点类型的基本不精确性?
- 来自 Android 应用程序内部的 boost 类型的 boost::wrapexcept<boost::system::system_error> 的未捕获异常
- 使用 Boost.Spirit 解析具有混合数据类型的 OBJ 文件?
- 使用自定义访问者时具有自定义类型的提升变体失败(源自 boost::static_visitor)
- 在其他容器中使用 boost::container::static_vector 时,GCC 编译错误"将'const s'绑定到类型's&'的引用丢弃限定符"
- Boost.Python :C++模板类型匹配的嵌套命名空间
- 我正在将一个 std::string 传递给一个 boost 函数,该函数对该类型进行常量引用,但该值发生了变化
- Boost.Hana:在 constexpr 上下文中将值元组转换为相应类型的元组
- 如何在Boost::program_options配置文件中为非字符串的自定义选项值类型处理空格
- 从具有部分专用化的boost:hana::set中提取类型失败
- boost odeint 中的受控误差步进器是否支持复杂的数据类型?
- boost::p rogram_options 验证每个参数而不是每个参数类型?
- boost multi_index - 如果元素类型仅支持移动语义,如何遍历它?
- 标准::键映射和/或 boost::any 类型的值的类型检查
- 是否可以使用 Boost.Hana 将 std::array 解压缩到非类型模板参数包中
- 检查两个 Boost.MPL 序列是否按任何顺序包含相同的类型
- 任何表示具有有序元素的对的 stl/boost 类型
- 抽象与线程相关的 STL 和 Boost 类型和方法
- Boost类型擦除的实践和发现