一些新特性已经添加到最近的国际标准化组织C++标准中,最初是boost的一部分。这自然提出了编写可移植代码的指导方针问题。
在使用该标准的旧版本时,是否有一种可移植地使用新语言特性的规范方法?
如果您已经在使用boost,那么您应该继续使用boost版本,还是使用C++17中的版本或实验性版本?
你在尝试便携方面应该走多远?
我很惊讶没有在某个地方发现这个问题是一个常见问题。难道不应该在核心指南,促进常见问题,或者作为ISO委员会的文件中对此有所了解吗?
似乎有一些关于个人特征的问题,但更少考虑更广泛的观点。例如:
发布于 2018-05-15 10:37:31
有几个项目提供了多个填充。提振并不是唯一的选择,尽管它可能是最普遍和最全面的。还有其他一些,例如:
您可以使用使用子句导入适当的版本,但这是有风险的,因为它掩盖了语义差异,请参见:
您可以考虑使用特征测试宏并创建标题,如“cxx17 17/optional.hpp”,其中包含:
#ifdef __cpp_lib_experimental_optional
#include <experimental/optional>
namespace cxx17
{
using std::experimental::optional;
}
#elif __cpp_lib_optional
#include <optional>
namespace cxx17
{
using std::optional;
}
#else
#include <boost/optional.hpp>
namespace cxx17
{
using boost::optional;
}
#endif然而,这仍然是关于语义差异的论文。在某些情况下,boost库故意与标准不同。
您还必须考虑到,没有像可移植代码这样的东西,只有已经移植的代码。除非您在每个环境中对代码进行了实际测试,否则无法保证您的代码能够工作。
如果您试图使代码像这样可移植,并且无意在这些环境中运行它,那么它只是一个YAGNI (您将不需要它)。使用特性测试宏显示您很聪明,但是如果不使用它们,它可能会被认为是噪音。
如果您已经在使用boost,那么可以假设您可以继续使用它,并将其留给boost (以及boost维护人员)来检测您是在使用C++17还是TS,并按此操作。除非您有大量资源,否则您可以假设boost库比代码更可移植。
一个好的做法是记录意图。如果您只是想让未来的维护人员更容易地使用C++11,但现在您只能使用,那么可以考虑这样做(在cxx17 17/import_optional.hpp中):
#include <boost/optional.hpp>
namespace cxx17
{
using boost::optional;
}并使用cxx17命名空间表示您希望使用C++17,但还不能使用。这也意味着您认为boost和ISO标准之间的偏差是项目的一个缺陷。其他用户可能更喜欢boost版本。(例如std::变体和boost::变体有什么区别?)
这主要适用于纯库扩展。对于语言本身的更改,有时可以使用宏进行仿真。这可能是丑陋的,所以它可能更好地坚持一个给定的标准。
这可能是一个社区wiki,但我会等待一个更有学问的大师想出一个更好的答案。
https://stackoverflow.com/questions/50348104
复制相似问题