C++ Boost/C++11 的包装器

C++ wrapper for boost/c++11

本文关键字:包装 C++11 Boost C++      更新时间:2023-10-16

我不确定问题的标题是否正确。这就是问题所在。我正在编写一个使用一些 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++ 标准库实现的状态页面开始。