Gcc 从boost到std::实验和c++17

Gcc 从boost到std::实验和c++17,gcc,boost,c++17,Gcc,Boost,C++17,我通常使用boost来实现一些特性,特别是boost::filesystem 1.58.0 此外,我还使用std::experimental来查看我的编译器尚未将其作为标准-g++5.4.0 20160609 因为我使用的boost特性已经得到了改进,所以我想准备好使用c++17 第四,我在代码中使用以下命令: using namespace boost::filesystem; //the only exeption is to boost::filesystem::remove using

我通常使用boost来实现一些特性,特别是boost::filesystem 1.58.0

此外,我还使用std::experimental来查看我的编译器尚未将其作为标准-g++5.4.0 20160609

因为我使用的boost特性已经得到了改进,所以我想准备好使用c++17

第四,我在代码中使用以下命令:

using namespace boost::filesystem; //the only exeption is to boost::filesystem::remove

using namespace std::experimental;
如果我将boost行替换为“使用命名空间std::experimental::filesystem;”我将得到与boost实现完全相同的行为,代码中不再做任何更改

在我获得具有这些特性的官方gcc编译器后,我需要做的是: 更改“std::experimental::filesystem;”到“std::filesystem” b删除行“使用命名空间std::experimental;”

在我的代码中不做任何更改就能得到相同的行为


c++17中还包括哪些其他boost功能,并且可以像上面描述的那样轻松替换?

boost不属于ISO标准

不,你不应该盲目地期望语义是相同的。即使在80%-90%的情况下,接口是兼容的,您也会得到不同

例如,boost::optional是允许的,但在标准版本中不允许。还有其他区别

一般来说,使用它是不好的做法,特别是如果你用它来记录这些差异。如果您想让依赖项保持移动,最好创建自己的名称空间和包装函数

在我的代码库中,例如,我使用

namespace XXX {

     using nullopt_t = ::boost::none_t;
     static CONSTEXPR nullopt_t nullopt = {};

     template <typename T> using optional = ::boost::optional<T>;
}
我们只在任何非boost特定代码中使用此接口


这将有助于过渡到标准库版本,但已概述的语义差异除外。

Boost不属于ISO标准

不,你不应该盲目地期望语义是相同的。即使在80%-90%的情况下,接口是兼容的,您也会得到不同

例如,boost::optional是允许的,但在标准版本中不允许。还有其他区别

一般来说,使用它是不好的做法,特别是如果你用它来记录这些差异。如果您想让依赖项保持移动,最好创建自己的名称空间和包装函数

在我的代码库中,例如,我使用

namespace XXX {

     using nullopt_t = ::boost::none_t;
     static CONSTEXPR nullopt_t nullopt = {};

     template <typename T> using optional = ::boost::optional<T>;
}
我们只在任何非boost特定代码中使用此接口


这应该有助于过渡到标准库版本,除了已经概述的语义差异。

Boost和后来衍生的标准化往往有所不同

对于文件系统,有一些突破性的变化。在我的头顶上,一个标志被更改为标志的位字段

然而,90%的代码都是相同的

而不是使用名称空间boost::filesystem;,考虑使用

#ifdef USE_BOOST_FILESYSTEM
  namespace filesystem = boost::filesystem;
#else
  namespace filesystem = std::experitmental::filesystem;
#endif
现在使用filesystem::作为API使用的前缀

在少数实现不同的地方,您可以使用更多的ifdef


该名称空间中的内容现在在代码中突出显示,并且您有一个ifdef来处理它们不兼容的情况。

Boost和后来派生的标准化倾向于不同

对于文件系统,有一些突破性的变化。在我的头顶上,一个标志被更改为标志的位字段

然而,90%的代码都是相同的

而不是使用名称空间boost::filesystem;,考虑使用

#ifdef USE_BOOST_FILESYSTEM
  namespace filesystem = boost::filesystem;
#else
  namespace filesystem = std::experitmental::filesystem;
#endif
现在使用filesystem::作为API使用的前缀

在少数实现不同的地方,您可以使用更多的ifdef


该名称空间中的内容现在在您的代码中突出显示,并且您有一个ifdef来处理它们不兼容的极端情况。

虽然一些新功能基于Boost库或受其启发,但可能没有将Boost库一对一转换为标准库。话虽如此,我怀疑会有什么大的或常见的改变,如果有的话,那么您应该能够像Boost文件系统库一样使用std::filesystem。Boost文件系统和Boost线程是我所知道的唯一两个尝试跟踪标准建议的线程。这一点立即反映在一个事实上,即他们在公共接口Boost Filesystem v2/v3中进行了许多突破性的更改,Boost Thread使用了十几个重要的有条件编译的功能选择宏,而一些新功能基于Boost库或受其启发,Boost库可能不会一对一地转换为标准库。话虽如此,我怀疑会有什么大的或常见的改变,如果有的话,那么您应该能够像Boost文件系统库一样使用std::filesystem。Boost文件系统和Boost线程是我所知道的唯一两个尝试跟踪标准建议的线程。这一点立即反映在他们
在公共接口Boost Filesystem v2/v3中进行了许多突破性的更改,Boost线程使用了十几个重要的有条件编译的功能选择宏。我理解为什么在Boost这样的外部库中使用指令不是一个好做法。我还读到,在std中使用名称空间std是不好的;我不明白为什么,这显然是一种选择。在头文件中使用指令很少是一件好事,因为它会引起名称冲突,并且会微妙地引入错误,例如ADL。我想,值得注意的例外是内联名称空间和版本控制。例如,在本例中,我是在激励为什么它不是切换实现的可靠方法:规范是不可互换的。我理解为什么在boost这样的外部库中使用指令不是一个好的做法。我还读到,在std中使用名称空间std是不好的;我不明白为什么,这显然是一种选择。在头文件中使用指令很少是一件好事,因为它会引起名称冲突,并且会微妙地引入错误,例如ADL。我想,值得注意的例外是内联名称空间和版本控制。请参阅,例如,在本例中,我正在激发为什么它不是切换实现的可靠方法:规范是不可互换的。