假设我的代码使用std :: array,我想这样做:
file:array
#pragma once
#ifdef MY_TOOLSET_HAS_STD_ARRAY
#include <array> //recursive include here?
#else
#include <boost/array.hpp>
namespace std
{
using boost::array;
}
#endif
Run Code Online (Sandbox Code Playgroud)
这样我的项目可以使用std :: array而无需关心编译器/平台.一个问题(至少)是当std :: array可用时,include将是递归的,当我真正想要的是(语义上)"包括如果这个包括不存在则将包括的头".
关于如何做到这一点的任何想法?我知道把boost :: array拉到std也可能被认为是不好的做法,所以我对这个问题也很感兴趣.
解决这个"问题"的正确方法是首先不介绍它.
如果您的某些构建环境支持C++ 11但其他构建环境不支持,那么请找到所有构建环境支持的公共子集并使用它.在这种情况下,该公共子集似乎是Boost.所以你应该使用boost::array.
还要考虑如果你开发和测试使用std::array,那么你已经完成了未经测试的整个代码分支 - 使用的那个boost::array.
我都是懒惰的编程 - 但是聪明的懒惰编程.延迟编程并不意味着hacky或笨拙的编程,并且智能延迟编程不会调用未定义的行为,因为添加boost::array到std命名空间会.说"我不想通过我所有的代码并std::array改为boost::array",这不是引入黑客行为和未定义行为的好理由.它可以像调用sed进行所有这些更改一样简单,它可能只需要5分钟.