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

时间:2014-10-03 12:12:37

标签: c++ boost

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

2 个答案:

答案 0 :(得分:6)

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

升压::路径::串

the native pathname format中返回std::string

升压::路径:: generic_string

the generic pathname format中返回std::string

何时使用它们

嗯,这取决于你,取决于你的需求!以下引文,再次来自文档,可能会有所帮助......

  

[注意:对于ISO / IEC 9945,不进行转换,因为原生格式和通用格式相同。对于Windows,反斜杠转换为斜杠 - 后注]

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

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

答案 1 :(得分:2)

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

在你的系统上,就升级而言,路径元素之间的首选分隔符是\。但是,/可接受的分隔符。

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

  

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

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

然后,当您调用t/fn时,会使用appends//=运算符。它声明:

  

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

     

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

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,请使用inin.begin()以及in.end()重复boost::fs::path::iterator