boost中的path::string()和path::generic_string()有啥区别?

Posted

技术标签:

【中文标题】boost中的path::string()和path::generic_string()有啥区别?【英文标题】:What is the difference between path::string() and path::generic_string() in boost?boost中的path::string()和path::generic_string()有什么区别? 【发布时间】:2014-10-03 12:12:36 【问题描述】:

boost::path::string()boost::path::generic_string() 有什么区别,我应该在什么时候使用它们?

【问题讨论】:

您在阅读每个函数的文档时发现了什么? 我找不到文档! Then you didn't look very hard... @mans 说真的。不到 3 小时前,我说了同样的话……"I've linked to the documentation page for cmd.exe options. [...] if you don't feel like reading the documentation yet."。当你要求别人做所有的阅读时,你就不能成为一名程序员 @Lightness 尚不清楚爱好者或专业程序员在问这个问题时会问什么。显然,任何有互联网访问权限的爱好者或专业程序员都可以用谷歌搜索文档:因此,上述文档公然提供的答案不可能是爱好者或专业程序员想要知道的。消除这一点,很不清楚 mans 在问什么。 :p (如果是 C++ 标准的文档,那么几乎没有人可以阅读并理解它(有时甚至作者也不行):但链接的文档并不是那么迟钝) 【参考方案1】:

这在the documentation中有明确说明;您只需阅读文档即可获得知识和理解。请养成这样做的习惯,从现在开始。

升压::路径::字符串

在the native pathname format 中返回一个std::string

boost::path::generic_string

在the generic pathname format 中返回一个std::string

什么时候使用它们

好吧,这取决于您,并且取决于您的需求!以下引用,同样来自文档,可能会有所帮助……

[注意:对于 ISO/IEC 9945,不会发生转换,因为本机格式和通用格式是相同的。对于 Windows,反斜杠转换为斜杠 --end note]

在日常使用中,你可以有效地说:

在 Windows 上,本机格式有反斜杠,通用格式有斜杠; 在 Linux 上,两种格式都有斜杠。

【讨论】:

谢谢。它们中的任何一个都以“”返回路径,所以如果路径有空间,它可以直接用于传递给其他命令吗? 许多会像这样字符串化,IIRC(outstream << path 根据平台和可能的内容添加它们)。这是非权威的,请查看文档 声明“这在文档中明确说明”是一个巨大的夸大其词。一切都很清楚。 Boost Filesystem 文档是如何不编写文档的示例。 @Zbyl:如果您只需单击我在回答的第一句话中提供的链接,您将直接获得对差异的非常清晰的解释。我并不是说 Boost.Filesystem 拥有世界上最好的文档,但它确实包含了这个问题的答案,并且 OP 显示出零研究工作(这在当时是他们的一个连续习惯)。 啊,是的,显然“路径观察者”是一个非常明显的术语,任何人都知道。很好,它在文档的不同部分“明确说明”,但作为在遗留代码中遇到这个问题的人,我有完全相同的问题,这个问题/答案很有帮助。【参考方案2】:

读心术,你是在 Windows 系统上编程。

在您的系统上,就 boost 所知,路径元素之间的首选分隔符是 \。但是,/ 是一个可接受的分隔符。

boost::fs::path docs 状态的构造函数:

[注意:对于 ISO/IEC 9945 和 Windows 实现,通用格式已经可以作为本机格式接受,因此不执行从通用到本机的转换。 --尾注]

注意关于 Windows 实现的子句——通用格式(带有/ 分隔符)已经可以接受,因此不进行任何转换。

然后,当您调用 t/fn 时,将使用 appends//= 运算符。它指出:

[注意:对于类似 ISO/IEC 9945 的实现,包括 Unix 变体、Linux、 和 Mac OS X,首选的目录分隔符是一个正斜杠。

对于类似 Windows 的实现,包括 Cygwin 和 MinGW,首选的目录分隔符是单个反斜杠。--end note]

Windows 系统上首选的分隔符是\

所以在构造时,不会发生从泛型到系统的转换——但在附加operator/ 或类似名称时,它是。

这会导致你的字符串看起来很丑。

如果您想解决问题,可以使用beginend 遍历您的“格式错误”路径,并使用operator/ 将元素存储/附加到新路径中。

boost::fs::path fix( boost::fs::path in ) 
  boost::fs::path retval;
  for ( auto element : in ) 
    if (retval.empty())
      retval = in;
    else
      retval /= in;
  
  return retval;

如果我正确阅读了文档,它将采用您的混合斜线路径并生成一个干净的路径。

如果您卡在 C++03 中,请使用 in.begin()in.end()boost::fs::path::iterator 迭代 in

【讨论】:

以上是关于boost中的path::string()和path::generic_string()有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

C++ 中的 boost::scoped_ptr 和 STL

operator== 和 boost::detail::atomic_count 中的显式构造函数?

boost几何中的环和多边形有什么区别?

boost::asio 中的 NAT 打孔

Boost.Filesystem 中的 MAX_PATH 限制

Boost ASIO 中的拍卖