boost中path::string()和path::generic_string()有什么区别?

问题描述 投票:0回答:2

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

c++ boost
2个回答
8
投票

这在文档中有明确说明:

升压::路径::字符串

本机路径名格式
返回 std::string

升压::路径::generic_string

通用路径名格式
返回 std::string

何时使用它们

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

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

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

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

3
投票

读懂你的想法,你正在 Windows 系统上编程。

在您的系统上,据 boost 所知,路径元素之间的首选分隔符是

\
。然而,
/
是一个可接受的分隔符。

boost::fs::path
文档状态的构造函数:

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

请注意有关 Windows 实现的条款 - 通用格式(带有

/
分隔符)已经可以接受,因此不会进行任何转换。

然后,当您调用

t/fn
时,将使用
appends
/
/=
运算符。它指出:

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

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

Windows 系统上首选分隔符是

\

因此,在构造时,不会发生从通用到系统的转换 - 但在附加

operator/
或类似内容时,就会发生。

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

如果您想解决问题,您可以使用

begin
end
迭代“格式错误”的路径,并使用
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
in.begin()
in.end()
迭代
boost::fs::path::iterator

© www.soinside.com 2019 - 2024. All rights reserved.