8

我不确定问题的标题是否正确。这是问题所在。我正在编写一个使用一些 c++11 库功能的库。显然,并非所有实现都支持这些库,因此存在可移植性问题。此处关注哪个库并不重要。一种解决方案是使用 boost,它已经提供了很多 c++11 库。所以我的解决方案是定义一个宏,say USE_CXX11,并定义一个新的命名空间say internal,并将名称引入这个依赖于宏的内部命名空间。例如,假设我需要使用fooc++ 库中的名称,该库<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。我的图书馆将获取正确的标题和命名空间。到目前为止,这有效。希望我已经很好地解释了我的意图。

但上述解决方案对我来说似乎很丑陋。这种事情有更好的做法吗?或者有没有这种方法行不通的可能情况?

4

2 回答 2

5

你的解决方案对我来说很好;唯一的问题是(正如切特提到的)在 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
}}
于 2012-06-05T04:39:58.293 回答
2

我不认为这是一个可行的解决方案。有条件地在类之间切换将限制它们的使用仅限于那些具有相同签名和语义的成员函数。您还将访问重定向到标准库,这对许多开发人员来说可能感觉不自然。

如果可用性是 C++03 和 C++11 之间的一个问题,那么你绝对应该使用 Boost 来解决所有问题。如果 C++11 是您唯一的目标,您可能会更成功地评估各种编译器以查看它们支持的语言和库功能。选择那些得到很好支持并被认为没有错误的。对于其他所有内容,请使用 Boost 并在必要时稍后重构以支持更多 C++11 库功能。串联使用这些库而不是在它们之间切换会更好。

您可以从GCC 的 C++ 标准库实现的状态页面开始。

于 2012-06-05T02:26:34.627 回答