c++;17填充和增压 一些新的特性已经加入到了最近的ISO C++标准中,最初是Boost的一部分。 这自然提出了编写可移植代码的指导原则问题

c++;17填充和增压 一些新的特性已经加入到了最近的ISO C++标准中,最初是Boost的一部分。 这自然提出了编写可移植代码的指导原则问题,c++,boost,c++17,C++,Boost,C++17,在使用旧版本的标准时,是否有一种规范的方法可移植地使用新的语言功能? 如果您已经在使用boost,您应该继续使用boost版本、C++17中的版本还是实验版本 为了便于携带,你应该走多远 我很惊讶没有发现这个问题是某个地方的常见问题。 核心指南、boost常见问题解答和/或ISO委员会文件中不应该有这样的内容吗 似乎有关于个人特征的问题,但较少考虑更广泛的观点。 例如: 有几个项目提供多填充。 Boost不是唯一的选择,尽管它可能是最常见和最全面的选择。 还有其他一些,例如:

在使用旧版本的标准时,是否有一种规范的方法可移植地使用新的语言功能?

如果您已经在使用boost,您应该继续使用boost版本、C++17中的版本还是实验版本

为了便于携带,你应该走多远

我很惊讶没有发现这个问题是某个地方的常见问题。 核心指南、boost常见问题解答和/或ISO委员会文件中不应该有这样的内容吗

似乎有关于个人特征的问题,但较少考虑更广泛的观点。 例如:


有几个项目提供多填充。 Boost不是唯一的选择,尽管它可能是最常见和最全面的选择。 还有其他一些,例如:

您可以使用using子句导入适当的版本,但这是有风险的,因为它掩盖了语义差异 另见:

你可以考虑使用 并创建类似“cxx17/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
#ifdef uu cpp u lib(可选)
#包括
命名空间cxx17
{
使用std::实验::可选;
}
#elif uuu cpp u lib_可选
#包括
命名空间cxx17
{
使用std::可选;
}
#否则
#包括
命名空间cxx17
{
使用boost::可选;
}
#恩迪夫
然而,这篇论文仍在讨论语义差异。 在某些情况下,boost库故意与标准不同

<>你也必须考虑到没有便携代码这样的东西。 只有已移植的代码。你不能保证你的代码会工作 除非您已经在每个环境中对其进行了实际测试

如果您试图让您的代码像这样可移植,并且无意 在这些环境中运行它只是一个YAGNI(你不需要它)。 使用功能测试宏表明您很聪明,但如果不使用它们,可能会被视为噪音

如果您已经在使用boost,那么可以放心地假设您可以继续使用它 让boost(和boost维护人员)来检测您使用的是C++17还是TS 并按此行事。除非你有很多资源,否则你可以假设 boost库比您的代码更易于移植

一件好事是记录意图。 如果您只是想让未来的维护人员的生活变得更轻松,但您仍然无法使用 C++ 11,现在你可以考虑只是做(在CXX17/InjultOrthopy.HPP):

#包括
命名空间cxx17
{
使用boost::可选;
}
并使用cxx17名称空间表示希望使用C++17 但现在还不能。这也意味着您认为Boost与ISO标准之间的偏差是一个错误。 为了你的项目。其他用户可能更喜欢boost版本。 (举例来说)

这主要适用于纯库扩展。 对于语言本身的更改,有时可以使用宏模拟它们。这可能很难看,因此最好坚持一个给定的标准


这可能是一个社区wiki,但我会等待一位更有经验的大师给出更好的答案。

boost库总是比标准库更完整、功能更丰富、更可移植。使用boost,“你应该走多远”-在没有上下文的情况下呼吁价值判断。这个问题需要主观的回答。使用您自己或项目成员的经验。PS。我认为,如果问题集中在一个非常具体的主题上(例如链接的“别名boost::variant或std::variant not Compileable”)@DevSolar,那么这个问题是可行的,因为为一个工具链编写的代码在与另一个工具链编译时可以工作。标准的黑暗角落往往在各种标准库中存在差异和缺陷(微软的非标准销毁期货处理、苹果的错误正则表达式库等)。boost团队努力保持跨工具链的兼容性。由于操作系统的限制或工具链的缺陷,他们无法很好地记录这些差异。@DevSolar此外,标准并发库远远落后于boost.thread。有一种模糊的危险,我们可能最终在c++20中得到执行器和未来的延续。。。十年前,它以其他任何一种语言出现。当boost特性最终达到标准时,它们总是被削减到无用的地步(见上面的线程)。我的建议是,在写C++ 30年之后,你将标准化你的编译器将要承受的并保持升级的最新版本。(为了记录在案,我对信息的答案投了更高的票,不管问题的价值是什么:))abseil在这里有什么特别的补充吗(除了)?我想如果你同时使用abseil和boost,这个问题会变得更复杂。@BruceAdams我想abseil的方法大致上是“这个问题是错误的,总是在开头编译。”@barry我猜你比sehe更不喜欢:)我从来没有碰过abseil。我想那会让我成为更大的粉丝。没有人提到“我们同时使用abseil和boost”,我只想指出“谷歌已经开发了许多抽象,这些抽象要么与C++14、C++17以及更高版本中的功能相匹配,要么与之紧密匹配。使用这些抽象的abseil版本,你现在就可以访问这些功能,即使你的代码还没有准备好在后C++11时代使用。”我想这至少和其他提到的图书馆一样重要。
#include <boost/optional.hpp>
namespace cxx17
{
using boost::optional;
}