繁体   English   中英

用于boost / c ++ 11的C ++包装器

[英]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。 我的库将获取正确的标题和命名空间。 这项工作到目前为止。 希望我已经很好地解释了我的意图。

但上述解决方案对我来说似乎非常难看。 对于这种事情,有没有更好的做法? 或者有任何可能的情况,这种方法不起作用?

你的解决方案对我来说很好; 在Boost和C ++ 11接口和/或实现不同的情况下,唯一的问题是(如Chet所提到的)。

实际上,我是在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是您唯一的目标,您可以更好地评估各种编译器,以查看它们支持的语言和库功能。 选择那些得到良好支持并被视为无bug的应用程序。 对于其他所有内容,如果需要,可以在以后使用Boost和重构​​来支持更多C ++ 11库功能。 你最好不要串联使用这些库,而不是在它们之间切换。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM