C++ Boost/C++11 的包装器
C++ wrapper for boost/c++11
我不确定问题的标题是否正确。这就是问题所在。我正在编写一个使用一些 c++11 库功能的库。显然,并非所有实现都支持这些库,因此存在可移植性问题。这里关注哪个库并不重要。一种解决方案是使用 boost,它已经提供了大量的 c++11 库。所以我的解决方案是定义一个宏,比如USE_CXX11
,并定义一个新的命名空间,比如internal
,并将名称引入依赖于宏的内部命名空间。例如,假设我需要使用来自 c++ 库<foo>
的名称foo
,该名称在 <boost/foo/foo.hpp>
中也可用。我所做的是
#ifdef USE_CXX11
#include <foo>
#else
#include <boost/foo/foo.hpp>
#endif
namespace internal {
#ifdef USE_CXX11
using std::foo;
#else
using boost::foo::foo;
#endif
}
在图书馆的其余部分,我只使用internal::foo
.使用此库的第三方代码可以定义正确的宏来指示它们是否有有效的 C++ 11 实现,或者它们只能使用 boost。我的库将选取正确的标头和命名空间。到目前为止,这有效。希望我已经很好地解释了我的意图。
但是上述解决方案对我来说似乎非常丑陋。对于这种事情,有没有更好的做法?或者是否有任何可能的情况,这种方法不起作用?
你的解决方案对我来说看起来不错;唯一的问题是(如Chet所提到的)在Boost和C++11接口和/或实现不同的情况下。
事实上,我在 Boost.Algorithms 库中这样做了(即将发布的 1.50 版本中的新功能)
namespace boost { namespace algorithm {
#if __cplusplus >= 201103L
using std::find_if_not; // Section 25.2.5
#else
template<typename InputIterator, typename Predicate>
InputIterator find_if_not ( InputIterator first, InputIterator last, Predicate p )
{
for ( ; first != last; ++first )
if ( !p(*first))
break;
return first;
}
#endif
}}
我不认为这是一个可行的解决方案。有条件地在类之间切换会限制它们的使用,仅使用那些具有相同签名和语义的成员函数。您还将访问重定向到标准库,这对许多开发人员来说可能会感到不自然。
如果可用性是 C++03 到 C++11 之间的一个问题,那么您绝对应该使用 Boost 来完成所有事情。如果 C++11 是您的唯一目标,您可能会更好地评估各种编译器,以了解它们支持哪些语言和库功能。选择那些得到良好支持并被认为没有错误的。对于其他所有内容,如有必要,请使用 Boost 并稍后重构以支持更多 C++11 库功能。与在它们之间切换相比,串联使用这些库会好得多。
您可以从 GCC 的 C++ 标准库实现的状态页面开始。
- 如何在c++17中制作一个模板包装器/装饰器
- std::vector的包装器,使数组的结构看起来像结构的数组
- 如何在c++迭代器类型中包装std::chrono
- 标准向量之上的 C++11 包装类
- C 11 / 14-是否有针对其他地方管理的资源的原始指针包装器
- 通用 C++11 函数包装器,用于基于任务的并行性
- 函数包装器初始化在 C++11 中是如何工作的
- 用C++11中的智能指针包装旧的C结构并自动释放它们
- c++11:如何编写一个包装函数来生成"std::function"对象
- C++11/14:如果函数存在,则对其进行包装
- 访问向量 c++11 中的引用包装元素
- C++11 模板函数别名与包装器
- C++ Boost/C++11 的包装器
- 将 c++11 std::function 包装在另一个 std::function 中
- C++11:unique_ptr抱怨类型不完整,但当我包装它时却没有
- 是否使用类包装器对符合 C++11 的对象进行线程安全访问
- 使用 C++11 接口包装 C 回调的最佳方法是什么?
- 用于OpenGL调用的c++11包装器
- c++11模板特化包装器
- C++11 std::函数和std::reference包装器,用于对std::set进行排序