【问题标题】:Why do C++ regular expression functions use output parameters?为什么 C++ 正则表达式函数使用输出参数?
【发布时间】:2021-09-15 10:43:06
【问题描述】:

根据core guidelines,C++ 中的输出参数通常被认为是代码异味。然而,我们在regular expressions library中有这样的功能

template< class BidirIt,
          class Alloc, class CharT, class Traits >
bool regex_match( BidirIt first, BidirIt last,
                  std::match_results<BidirIt,Alloc>& m,
                  const std::basic_regex<CharT,Traits>& e,
                  std::regex_constants::match_flag_type flags =
                      std::regex_constants::match_default );

其中m 是一个输出参数。是否有特定的原因会破坏此处的核心准则,而不是简单地按值返回 std::match_results

【问题讨论】:

  • 我的快速猜测:由于regex_match() 是一个重载函数,变体根本不返回匹配结果。因此,布尔值被用作返回值。
  • 核心指南没有将任何东西描述为代码异味。在这种情况下,他们建议首选返回值而不是输出参数。该措辞并不意味着“你不应该......” - 它的意思是“使用返回值,除非你有特定的理由使用输出参数”。在您选择的情况下,原因是该函数向用户返回了不止一种类型的输出 - 并且他们选择返回 bool(以指示是否找到匹配项)。除其他外,避免强制调用者进行相对昂贵的检查,如果匹配集(输出参数)为空

标签: c++ regex output-parameter cpp-core-guidelines


【解决方案1】:

也有一些例外:

  • 对于非值类型,例如继承层次结构中的类型,通过 unique_ptr 或 shared_ptr 返回对象。
  • 如果一个类型的移动成本很高(例如,数组),请考虑将其分配到空闲存储区并返回一个句柄(例如,unique_ptr),或者将它作为对非 const 目标对象的引用传递给填充(用作输出参数)。
  • 要在内部循环中对函数的多次调用重用承载容量的对象(例如,std::string、std::vector):将其视为输入/输出参数并通过引用传递。

我认为这是 regxr 匹配的第二种情况。

【讨论】:

    猜你喜欢
    • 2021-11-27
    • 1970-01-01
    • 2019-12-12
    • 1970-01-01
    • 2012-07-19
    • 1970-01-01
    • 1970-01-01
    • 2017-01-26
    • 2019-03-12
    相关资源
    最近更新 更多