我需要将在下一个C++版本(C++ 17)中添加的功能.我正在使用MS Visual Studio,它实现了C++ 11.我希望在几年后我会升级我的编译工具,因此可以通过标准库获得此功能.
与此同时,我需要手动实现它.我如何定义它以便将来很容易迁移?
我们std::clamp以此为例.
my_clamp.当我能够使用C++ 17,我可以开始使用std::clamp,以及可选做全局替换的my_clamp通过std::clamp.这看起来很难看,但可能不会产生任何意外.my::std,并且可以using namespace my.这样,我std::clamp今天就可以开始使用该名称,而不是稍后更改它.但是,这是危险/禁止的吗?clamp到std命名空间.这是UB,但可能会奏效.有没有缺点的方法?
是否有接受/习惯的方式这样做?
在这些情况下我通常做的是:
1. 尝试使用最新的 C++ 编译器和库,其中已经包含我需要的功能/设施。
2. 如果失败(即我被迫使用旧的 C++ 标准版本,比如说 C++11,因为旧的工具链),找到一个包含我需要的库
3. 更好,如果我需要的是已经包含在较新的 C++ 标准中或“参考实现”库已经存在,我尝试使用参考实现或接近的库,这将减少代码中的未来更改。
4. 熟悉boost 库,因为它很可能已经包含了您需要的内容,并且它很可能是未来 C++ 标准内容的参考实现。
5. 如果无法满足上述所有要求,无论出于何种原因,请编写自己的实现,但尽量保持其接口与标准提案相似。
对于不是来自 std:: 命名空间的任何内容,请使用命名空间别名来进一步减少未来的更改(当切换到较新的工具链和 std:: 时)。
注1:C++17是当前的C++标准,下一个应该是C++20。
注 2:MS VS2017(以及某种程度上的 2015)已经包含了 C++17 中的部分或大部分内容。
编辑以包含如何使用命名空间别名的示例
此示例与 C++ 文件系统内容相关,它(尚未)更新为使用 C++17 ,但它仍然仅限于 .
它主要依靠预处理器#defines(即HAVE_CXX_EXPERIMENTAL_FILESYSTEM)来启用/禁用所需的部分。我通常使用 CMake 来检测编译器和库功能,并以自动方式定义这些宏。
#if _MSC_VER >= 1900 // Microsoft Visual C++ 2015
#define HAVE_CXX_EXPERIMENTAL_FILESYSTEM
#endif
#if defined(HAVE_CXX_EXPERIMENTAL_FILESYSTEM)
// Have Filesystem TS
#include <experimental/filesystem>
namespace filesystem = std::experimental::filesystem;
using std::error_code;
#elif !defined(NO_BOOST)
// Fall-back to Boost.Filesystem library
#include <boost/version.hpp>
#if (BOOST_VERSION >= 103400)
#include <boost/filesystem.hpp>
#else
#include <boost/filesystem/path.hpp>
#include <boost/filesystem/convenience.hpp>
#include <boost/filesystem/exception.hpp>
#endif // (BOOST_VERSION >= 103400)
namespace filesystem = boost::filesystem;
using boost::system::error_code;
// Hack to fix differences with C++17 Filesystem TS
#define copy_options copy_option
#define overwrite_existing overwrite_if_exists
#else
#warning Not implemented
// or #include custom stuff
#endif
Run Code Online (Sandbox Code Playgroud)
上面的内容基本上是一个失败:
1. 如果可用,使用命名空间并为其设置别名
2. 使用 boost.filesystem(如果未使用 NO_BOOST 明确排除)
3. [可选] 如果需要,回退到自定义实现或其他库。
免责声明:这个解决方案可能并不完美,但它可以合理地满足我的需求。
| 归档时间: |
|
| 查看次数: |
200 次 |
| 最近记录: |