Gcc 从boost到std::实验和c++17
我通常使用boost来实现一些特性,特别是boost::filesystem 1.58.0 此外,我还使用std::experimental来查看我的编译器尚未将其作为标准-g++5.4.0 20160609 因为我使用的boost特性已经得到了改进,所以我想准备好使用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
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。我想,值得注意的例外是内联名称空间和版本控制。请参阅,例如,在本例中,我正在激发为什么它不是切换实现的可靠方法:规范是不可互换的。