我不确定问题的标题是否合适.这是问题所在.我正在编写一个使用一些c ++ 11库特性的库.显然,并非所有实现都支持这些库,因此存在可移植性问题.这里关注哪个库并不重要.一种解决方案是使用boost,它已经提供了很多c ++ 11库.所以我的解决方案是定义一个宏,比如说USE_CXX11,并定义一个新的命名空间,并根据宏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
}
Run Code Online (Sandbox Code Playgroud)
在图书馆的其他部分我只使用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
}}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
700 次 |
| 最近记录: |