C++ C++;boost/c+的包装器+;11

C++ C++;boost/c+的包装器+;11,c++,boost,c++11,C++,Boost,C++11,我不确定问题的标题是否恰当。问题就在这里。我正在编写一个使用一些c++11库功能的库。显然,并非所有的实现都支持这些库,因此存在可移植性问题。这里关注哪个图书馆并不重要。一个解决方案是使用boost,它已经提供了很多c++11库。因此,我的解决方案是定义一个宏,比如说USE\u CXX11,然后定义一个新的名称空间,比如说internal,并根据宏向这个内部名称空间引入名称。比如说,我需要使用一个名字 Foo,从C++库 ,这也可以在 中找到。我所做的是 #ifdef USE_CXX11 #in

我不确定问题的标题是否恰当。问题就在这里。我正在编写一个使用一些c++11库功能的库。显然,并非所有的实现都支持这些库,因此存在可移植性问题。这里关注哪个图书馆并不重要。一个解决方案是使用boost,它已经提供了很多c++11库。因此,我的解决方案是定义一个宏,比如说
USE\u CXX11
,然后定义一个新的名称空间,比如说
internal
,并根据宏向这个内部名称空间引入名称。比如说,我需要使用一个名字<代码> Foo<代码>,从C++库<代码> <代码>,这也可以在<代码> <代码>中找到。我所做的是

#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
}
#ifdef使用_CXX11
#包括
#否则
#包括
#恩迪夫
命名空间内部{
#ifdef使用_CXX11
使用std::foo;
#否则
使用boost::foo::foo;
#恩迪夫
}
在库的其余部分,我只使用
internal::foo
。使用此库的第三方代码可以定义适当的宏,以指示它们是否具有工作C++ 11实现,或者它们只能使用Boost。我的库将获取正确的头和名称空间。到目前为止,这是可行的。希望我已经很好地解释了我的意图


但上述解决方案在我看来非常丑陋。对于这类事情有更好的做法吗?或者这种方法有没有可能不起作用?

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

如果可用性是C++03和C++11之间的一个问题,那么您肯定应该在所有方面使用Boost。如果C++11是您唯一的目标,您可能会更成功地评估各种编译器,以了解它们支持哪些语言和库功能。选择那些受到良好支持并被认为没有bug的。如果有必要支持更多的C++11库功能,请稍后使用Boost和refactor。您最好同时使用这些库,而不是在它们之间切换


您可以从的状态页开始。

您的解决方案在我看来很好;唯一的问题是(正如切特提到的)Boost和C++11接口和/或实现不同的情况

事实上,我是在Boost.Algorithms库(即将发布的1.50版本中新增)中这样做的

namespace boost{namespace算法{
#如果uu cplusplus>=201103L
使用std::find_if_not;//第25.2.5节
#否则
模板
如果未找到,则输入迭代器查找(先输入迭代器,后输入迭代器,谓词p)
{
for(;first!=last;++first)
如果(!p(*第一个))
打破
先返回;
}
#恩迪夫
}}

如果它在Boost中,并且您需要支持过时的编译器,只需直接使用Boost中的一个。我需要支持使用Boost的旧编译器和出于任何原因(谁知道呢?)不想使用Boost的新编译器。Boost tr1不是一个解决方案。例如,libc++根本没有tr1,它从一开始就针对c++11。所以仍然存在两个名称空间的问题。我很长一段时间都在考虑使用boost。这就是项目开始的方式。但是后来我发现我使用的所有东西都可以在c++11中使用。因此,我认为如果用户拥有最新的编译器,最好不要强制第三方依赖。事实上,如果我需要boost,那么我至少需要boost 1.49,这是最新的版本,并且超过了大多数Linux发行版。即使是最近发布的fedora 17也只有boost 1.48。因此,通过强制boost,我需要用户自己安装boost,而不是每个人都想安装,而gcc4.6附带的libstdc++是可以的,如果有帮助的话,就使用boost。如果你只想要一门课或者什么的话,我会说重新制作。但是如果有人要使用C++,他们需要既有能力又有足够的意愿来安装Boost。这样做的唯一副作用是,您现在可以使用一个有用的库集合。@gmannick另一个问题是boost不如最近的c++11实现工作得好。例如,随机库仍然有一些bug,这会从数学上影响结果。此类缺陷也与不符合标准的行为有关。这些问题在最近的libstdc++或libc++或msvc 10中不存在。所以我只想要boost作为备份。
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
}}