无状态类仿函数什么时候可以代替 C 风格函数?

2023-11-25

我在 SO 上找到了一些很好的函子示例,例如this一,所有令人信服的例子似乎都在定义的类中使用了状态operator().

我在一本书中遇到一个例子,它定义了没有状态的函数调用运算符,我不禁觉得这是一种尴尬的用法,并且普通风格的函数指针会比使用更好operator()这里的各个方面 - 更少的代码,更少的变量(您必须实例化比较器),由于实例化,它可能更有效,并且不会丢失意义或封装(因为它只是一个函数)。

I know std::sort让你可以选择operator()类和函数,但由于上述逻辑,我总是只使用函数。

某个班级可能受到青睐的原因是什么?

这是示例(已转述):

class Point2D {
   //.. accessors, constructors
   int x,y;
};
class HorizComp {
public:
   bool operator()(const Point2D& p, const Point2D& q) const
   { return p.getX() < q.getX(); }
};

class VertComp {
public:
   bool operator()(const Point2D& p, const Point2D& q) const
   { return p.getY() < q.getY(); }
};

template <typename E, typename C>
void printSmaller(const E& p, const E& q, const C& isLess) {
   cout << (isLess(p, q) ? p : q) << endl; // print the smaller of p and q
}
//...
// usage in some function:
Point2D p(1.2, 3.2), q(1.5, 9.2);
HorizComp horizComp;
VertComp vorizComp;
printSmaller(p, q, horizComp);
printSmaller(p, q, vorizComp);

典型的原因是,当您这样做时:

bool less_than(const Point&, const Point&);
// ...
std::sort(..., &less_than);

谓词的模板参数如下:

bool(const Point&,const Point&)

由于排序函数接收函数指针,因此编译器更难内联内部谓词使用std::sort()。发生这种情况是因为你可以有另一个函数

bool greater_than(const Point&, const Point&);

它具有完全相同的类型,这意味着std::sort()实例化将在两个谓词之间共享。 (记住我说过它使内联更加困难, 不是不可能)。

相反,当您这样做时:

struct less_than {
    bool operator()(const Point&, const Point&) const;
};
// ...
std::sort(..., less_than());


struct greater_than {
    bool operator()(const Point&, const Point&) const;
};
// ...
std::sort(..., greater_than());

编译器生成一个唯一的模板实例化std::sort()对于每个谓词,可以更轻松地内联谓词的定义。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

无状态类仿函数什么时候可以代替 C 风格函数? 的相关文章

  • C 编程 - 文件 - fwrite

    我有一个关于编程和文件的问题 while current NULL if current gt Id Doctor 0 current current gt next id doc current gt Id Doctor if curre
  • 没有强命名的代码签名是否会让您的应用程序容易被滥用?

    尝试了解authenticode代码签名和强命名 我是否正确地认为 如果我对引用一些 dll 非强命名 的 exe 进行代码签名 恶意用户就可以替换我的 DLL 并以看似由我签名但正在运行的方式分发应用程序他们的代码 假设这是真的 那么您似
  • 嵌套接口:将 IDictionary> 转换为 IDictionary>?

    我认为投射一个相当简单IDictionary
  • HTTPWebResponse 响应字符串被截断

    应用程序正在与 REST 服务通信 Fiddler 显示作为 Apps 响应传入的完整良好 XML 响应 该应用程序位于法属波利尼西亚 在新西兰也有一个相同的副本 因此主要嫌疑人似乎在编码 但我们已经检查过 但空手而归 查看流读取器的输出字
  • 关于 C++ 转换:参数 1 从“[some_class]”到“[some_class]&”没有已知的转换

    我正在研究 C 并且遇到了一个错误 我不知道确切的原因 我已经找到了解决方案 但仍然想知道原因 class Base public void something Base b int main Base b b something Base
  • 堆栈溢出:堆栈空间中重复的临时分配?

    struct MemBlock char mem 1024 MemBlock operator const MemBlock b const return MemBlock global void foo int step 0 if ste
  • 使用 Bearer Token 访问 IdentityServer4 上受保护的 API

    我试图寻找此问题的解决方案 但尚未找到正确的搜索文本 我的问题是 如何配置我的 IdentityServer 以便它也可以接受 授权带有 BearerTokens 的 Api 请求 我已经配置并运行了 IdentityServer4 我还在
  • while 循环中的 scanf

    在这段代码中 scanf只工作一次 我究竟做错了什么 include
  • SolrNet连接说明

    为什么 SolrNet 连接的容器保持静态 这是一个非常大的错误 因为当我们在应用程序中向应用程序发送异步请求时 SolrNet 会表现异常 在 SolrNet 中如何避免这个问题 class P static void M string
  • 控件的命名约定[重复]

    这个问题在这里已经有答案了 Microsoft 在其网站上提供了命名指南 here http msdn microsoft com en us library xzf533w0 VS 71 aspx 我还有 框架设计指南 一书 我找不到有关
  • 如何序列化/反序列化自定义数据集

    我有一个 winforms 应用程序 它使用强类型的自定义数据集来保存数据进行处理 它由数据库中的数据填充 我有一个用户控件 它接受任何自定义数据集并在数据网格中显示内容 这用于测试和调试 为了使控件可重用 我将自定义数据集视为普通的 Sy
  • 垃圾收集器是否在单独的进程中运行?

    垃圾收集器是否在单独的进程中启动 例如 如果我们尝试测量某段代码所花费的进程时间 并且在此期间垃圾收集器开始收集 它会在新进程上启动还是在同一进程中启动 它的工作原理如下吗 Code Process 1 gt Garbage Collect
  • 什么时候虚拟继承是一个好的设计? [复制]

    这个问题在这里已经有答案了 EDIT3 请务必在回答之前清楚地了解我要问的内容 有 EDIT2 和很多评论 有 或曾经 有很多答案清楚地表明了对问题的误解 我知道这也是我的错 对此感到抱歉 嗨 我查看了有关虚拟继承的问题 class B p
  • 向现有 TCP 和 UDP 代码添加 SSL 支持?

    这是我的问题 现在我有一个 Linux 服务器应用程序 使用 C gcc 编写 它与 Windows C 客户端应用程序 Visual Studio 9 Qt 4 5 进行通信 是什么very在不完全破坏现有协议的情况下向双方添加 SSL
  • 将控制台重定向到 .NET 程序中的字符串

    如何重定向写入控制台的任何内容以写入字符串 对于您自己的流程 Console SetOut http msdn microsoft com en us library system console setout aspx并将其重定向到构建在
  • 基于 OpenCV 边缘的物体检测 C++

    我有一个应用程序 我必须检测场景中某些项目的存在 这些项目可以旋转并稍微缩放 更大或更小 我尝试过使用关键点检测器 但它们不够快且不够准确 因此 我决定首先使用 Canny 或更快的边缘检测算法 检测模板和搜索区域中的边缘 然后匹配边缘以查
  • 测试用例执行完成后,无论是否通过,如何将测试用例结果保存在变量中?

    我正在使用 NUNIT 在 Visual Studio 中使用 Selenium WebDriver 测试用例的代码是 我想在执行测试用例后立即在变量中记录测试用例通过或失败的情况 我怎样才能实现这一点 NUnit 假设您使用 NUnit
  • IEnumreable 动态和 lambda

    我想在 a 上使用 lambda 表达式IEnumerable
  • C# - OutOfMemoryException 在 JSON 文件上保存列表

    我正在尝试保存压力图的流数据 基本上我有一个压力矩阵定义为 double pressureMatrix new double e Data GetLength 0 e Data GetLength 1 基本上 我得到了其中之一pressur
  • 使用.NET技术录制屏幕视频[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有没有一种方法可以使用 NET 技术来录制屏幕 无论是桌面还是窗口 我的目标是免费的 我喜欢小型 低

随机推荐

  • 如何将 C# 方法添加到现有的大型 wix 脚本中

    我们现有的 wix 脚本相当复杂且冗长 所有自定义操作均使用内联 vbscript 执行 我想将其中一些操作从 vbscript 切换到 C 各地的所有示例都以 在 VisualStudio 中创建一个 wix 项目 开头 有没有关于如何将
  • 构建并安装 x86_64 而不是 i386 的 Brew 应用程序?

    我完成此操作后 酿造安装git 我这样做 哪个git 返回 usr local bin git 然后我这样做 文件 usr local bin git 返回 usr local bin git Mach O 可执行文件 i386 我需要br
  • 数字和一位小数的正则表达式

    我似乎无法使用简单的正则表达式来工作 这是我目前所拥有的 Hours on input function e var regex d d 0 2 g if regex test this value if regex test this v
  • 获取变量名。 javascript“反射”

    有没有办法获取变量name 就像你可以在 Net 中使用反射做的那样 就像在这个场景中 function x y z if x 0 logger log variable x reflectedName has invalid value
  • 在应用程序域之间来回传递值

    我有以下代码 public class AppDomainArgs MarshalByRefObject public string myString static AppDomainArgs ada new AppDomainArgs m
  • 有关即将推出的 fork-join 框架的资源

    我正在寻找有关如何使用即将推出的 jsr166y fork join fences 和 extras166y ParallelArray 等 的组织良好的信息源 从教程到专家级别的内容 IBM Developerworks 网站有一个好系列
  • 如何写一个解释器?

    我决定用 Ruby 编写一个小型解释器作为我的下一个项目 我需要什么知识 技能才能成功 我还没有决定要解释的语言 但我正在寻找一种不是玩具语言 但相对容易编写解释器的语言 提前致谢 你至少必须学习 词法分析 将字符分组为标记 解析 将标记分
  • Bootstrap 缩略图中的垂直居中约束图像

    Using 推特引导程序 我正在尝试创建一个水平滚动的系列缩略图它允许在显示缩略图的行中使用滚动条 如下所示 使用以下 HTML 我可以完成大部分工作 div class row Hello there div div class row
  • fgets 实现 (K&R)

    我是编程新手 从 Objective C 开始 但决定在进一步发展之前先回到基础知识 我花了一些时间在 C 上 并且正在努力克服指针混乱 我的问题是关于 K R 所说的 fgets 是如何实现的 第 165 页 第二版 下面的代码直接来自文
  • 在片段中运行时更改方向时更改布局,而无需重新创建视图

    我尝试开发第一个应用程序 从网络下载图像并在网格视图中显示它们 gridview 是主 Activity 的一个片段 下载过程是通过 onCreate 函数中的 AsyncTask 完成的 为了在改变方向时不再次下载图像 我设置了andro
  • XML 数据类型方法“值”必须是字符串文字[重复]

    这个问题在这里已经有答案了 如何更改我的查询以免发生此错误 XML 数据类型方法 值 必须是字符串文字 T SQL代码 Declare Count Int 1 While count lt j Begin insert into mytab
  • 使用Google Closure编译器[重复]

    这个问题在这里已经有答案了 可能的重复 使用 Google Closure Compiler 编译 jQuery 我正在使用 jQuery 并且我的所有 JS 代码都在 application js 文件中 当我使用 Google Clos
  • 在 Android 上从 GPS 提供商获取“粗略”位置

    我的应用程序只需要非常粗略的位置数据 因此我最初将清单权限设置为ACCESS COARSE LOCATION 并设置一个位置侦听器NETWORK PROVIDER 这为我提供了我所需要的粗略位置估计 但前提是 Google 定位服务已打开
  • 论坛如何向您显示未读主题?

    我有用 php mysql 编码的用户讨论论坛 我想知道知名论坛如何向您显示哪些主题中有新帖子 通常是通过更改线程旁边的图标图像而不使用任何资源 The simplest方法是跟踪某人上次登录的时间 当他们回来访问时 从那时起更新的所有内容
  • iOS 13 `withTintColor` 不遵守我分配的颜色

    我发现新的 iOS 13 UIImage 属性的行为withTintColor renderingMode 难以理解 它的用途是什么 它与图像出现的上下文的色调颜色有何关系 例如 let im UIImage systemName circ
  • 字符串集??!​​!

    您熟悉这个块 Var mySet Set Of Char C Char begin mySet a b c If C In mySet Then ShowMessage Exists end 有什么办法可以申报吗Set Of STRING
  • 为什么我不能在 IE7 中使用相对 URL?

    我已经用谷歌搜索了一段时间 似乎找不到这个问题的答案 我的问题如下 对于我的 jquery 我需要我的链接是相对的而不是绝对的 我的 PHP 设置为返回相对 url 一切正常 直到我在 IE7 中测试它 由于某种原因 IE7 不断将我的相对
  • 如何删除名称以“-”开头的分支

    在尝试创建跟踪分支时 我设法创建了一个名为 t 的本地分支 我无法删除分支 因为分支名称也是一个参数 这是在 Windows 机器上 git branch D t fatal branch name required 逃避也无济于事 git
  • jQuery和prototype.js冲突,如何保持jQuery为$?

    所以我正在开发一个同时使用 jQuery 和prototype js 的网站 但是它们是冲突的 我进行了相当多的研究 发现人们解决这个问题的唯一方法是使用
  • 无状态类仿函数什么时候可以代替 C 风格函数?

    我在 SO 上找到了一些很好的函子示例 例如this一 所有令人信服的例子似乎都在定义的类中使用了状态operator 我在一本书中遇到一个例子 它定义了没有状态的函数调用运算符 我不禁觉得这是一种尴尬的用法 并且普通风格的函数指针会比使用