【问题标题】:what's the advantage of defining a class instead of a function in some c++ standard library?在某些 C++ 标准库中定义一个类而不是一个函数有什么好处?
【发布时间】:2022-01-08 01:26:55
【问题描述】:

最近我注意到 C++ std::less 是一个类,虽然它只是比较两个对象的值。这里是一个示例代码:

template <class T> struct less {
  bool operator() (const T& x, const T& y) const {return x<y;}
  typedef T first_argument_type;
  typedef T second_argument_type;
  typedef bool result_type;
};

那么定义一个类而不是一个函数有什么好处呢? 我也想知道为什么在类中没有数据成员的情况下使用'const'关键字?

【问题讨论】:

  • 一般来说很难给出答案。在这种情况下,可能是为了与标准库中的其他仿函数保持一致。一般来说,“普通函数”可以保持状态(如类和结构)。至于“为什么是 const”——因为最好将所有内容标记为 const 尽可能。
  • typedef T first_argument_type; typedef T second_argument_type; -- 那是旧的,现代 C++ 没有它
  • 一般来说,仿函数(函数对象)可以携带状态,以及传递给它的函数的附加使用信息(例如 typedefs),而指向函数的指针则不能。按值传递(模板化)仿函数作为模板参数的一个特定优势是编译器有机会进行内联,这对于函数指针通常是不可行的 - 并且(假设是现代优化编译器)通常会提供运行时性能优势。
  • 这能回答你的问题吗? why is std::less a functor?

标签: c++ oop stl


【解决方案1】:

主要用作模板参数,如std::set&lt;int, std::less&lt;int&gt;&gt;

std::set 等接口中的类模板参数用于代替函数指针,以便能够传递 确实 具有某些数据成员的其他类似函数的对象。此外,将其作为模板参数有助于编译器优化,尽管现代编译器在某些情况下也可以优化掉函数指针。

【讨论】:

  • 另外std::less&lt;/*void*/&gt;(允许透明比较)与函数指针不匹配(这将是一个完整的重载集)。
  • @Jarod42:确实如此,但不是最初选择的理由——专业化不在 C++98 中。
猜你喜欢
  • 1970-01-01
  • 2010-09-09
  • 1970-01-01
  • 1970-01-01
  • 2021-12-21
  • 2019-01-20
  • 2021-05-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多