2012-06-04 45 views
8

我不确定问题的标题是否正确。这是问题。我正在编写一个使用一些C++ 11库特性的库。显然不是所有的实现都支持这些库,因此存在可移植性问题。这里关心哪个库是无关紧要的。一种解决方案是使用boost,它已经提供了很多C++ 11库。所以我的解决方案是定义一个宏,如USE_CXX11,并定义一个新的名称空间,如internal,并根据宏将名称引入此内部名称空间。例如,我需要使用来自C++库<foo>的名称foo,该名称也可在<boost/foo/foo.hpp>中获得。我所做的是boost/C++的C++封装器11

#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。而我的图书馆将拾取正确的标题和名称空间。这工作到目前为止。希望我已经很好地解释了我的意图。

但上述解决方案对我来说似乎非常难看。这种事情有没有更好的做法?或者有什么可能的情况下,这种方法将无法正常工作?

+1

退房** ** Boost.TR1如果 –

+3

它在加速,你需要支持过时的编译器,直接使用Boost中的那个。 –

+0

为什么不直接使用boost? – fbafelipe

回答

5

您的解决方案对我来说看起来很好;在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 
}} 
2

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

如果可用性是C++ 03和C++ 11之间的一个问题,那么您绝对应该使用Boost来处理所有事情。如果C++ 11是您唯一的目标,您可以更好地评估各种编译器,以查看它们支持的语言和库功能。选择那些支持良好并且认为无bug的。对于其他所有内容,如果需要使用Boost和稍后重构以支持更多C++ 11库功能。你将会更好地使用这些库,而不是在它们之间切换。

您可以从GCC's C++ Standard Library implementation的状态页开始。