我不确定问题的标题是否正确。这是问题所在。我正在编写一个使用一些 c++11 库功能的库。显然,并非所有实现都支持这些库,因此存在可移植性问题。此处关注哪个库并不重要。一种解决方案是使用 boost,它已经提供了很多 c++11 库。所以我的解决方案是定义一个宏,say USE_CXX11
,并定义一个新的命名空间say internal
,并将名称引入这个依赖于宏的内部命名空间。例如,假设我需要使用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。我的图书馆将获取正确的标题和命名空间。到目前为止,这有效。希望我已经很好地解释了我的意图。
但上述解决方案对我来说似乎很丑陋。这种事情有更好的做法吗?或者有没有这种方法行不通的可能情况?