gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 17:52:12 26 4
gpt4 key购买 nike

我不确定问题的标题是否合适。这就是问题所在。我正在编写一个使用一些 c++11 库功能的库。显然并非所有实现都支持这些库,因此存在可移植性问题。这里关注哪个库并不重要。一种解决方案是使用 boost,它已经提供了很多 c++11 库。所以我的解决方案是定义一个宏,比如 USE_CXX11 , 并定义一个新的命名空间说 internal并根据宏将名称引入此内部 namespace 。例如说我需要使用名称 foo来自 C++ 库 <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。我的库将选择正确的 header 和命名空间。到目前为止这有效。希望我已经很好地解释了我的意图。

但是上面的解决方案在我看来非常难看。这种事情有更好的做法吗?或者是否存在这种方法不起作用的任何可能情况?

最佳答案

我觉得你的解决方案很好;唯一的问题是(正如 Chet 提到的那样)在 Boost 和 C++11 接口(interface)和/或实现不同的情况下。

事实上,我在 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
}}

关于用于 boost/c++11 的 C++ 包装器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10887332/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com