在 C++ 中将函数作为参数传递

2024-06-18

我对 C++ 有点生疏,在使用 Python 一年后我要转行了。当然,我想将 python 的懒惰转化为 C++。

我刚刚发现了 rot13,对此我感到很兴奋。我找到了 3 种方法,并且想做一些性能测试。 我还想看看修改字符串或创建新字符串是否有区别。所以我最终有 6 个函数。

在第一种方法中,我使用 std::map 来映射字符,因此我构建了一个初始化映射的类,在第二种方法中我使用三元运算符,第三种方法我使用位移位。

现在函数原型看起来像这样

// map dependent
void Rot13::convert_inplace(string& mystr){

string Rot13::convert(const string& mystr){

// ternary operator
void bitrot_inplace(string& mystr){

string bitrot(const string&  mystr){

// bit shift
void bitshiftrot_inplace(string& mystr){

string bitshiftrot(const string& mystr){

我想构造一个接受这些函数作为参数的函数,然后计算时间并打印结果

所以我看了一下stackoverflow,1 https://stackoverflow.com/questions/130322/how-do-you-pass-a-member-function-pointer, 2 https://stackoverflow.com/questions/130322/how-do-you-pass-a-member-function-pointer,我想出了这个

typedef void (*vfc)(string str);

void printtime_inplace(string title, vfc func){

我尝试了这种结构,但这意味着我受到以下限制vfc返回类型,在我的例子中是void or string,事实上我需要传递类的指针。 因此,我将必须执行 3 个函数来容纳不同的函数,即一个用于类成员函数的函数、一个用于 void 返回类型的函数和一个用于字符串返回类型的函数。

于是我问自己,这样的情况下我真的需要使用模板而不是写3次相同的函数吗?我真的对模板没有信心,但我应该做 3typedefs并构造 printtime 函数来接受模板?此外,有没有一种方法可以告诉模板您只接受这些类型(即我定义的类型)?

还有一个问题,这是一个好的设计吗?或者你会建议其他设计吗?另一种实现?


在我看来,最简单的方法是使用模板,而不是尝试编写具有具体类型的函数。

template<typename Function>
void printtime_inplace(string title, Function func)
{
    //...
    func(title);
    //...
}

现在,您可以使用任何“函数”。你可以向它传递一个常规函数、一个仿函数、一个 lambda、一个std::function,基本上,任何可调用的。编译器将为您消除不同的实例化,但就您的代码而言,您正在调用相同的函数。

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

在 C++ 中将函数作为参数传递 的相关文章

  • 是否可以使静态控件透明?

    我正在尝试实现一个静态控件 该控件刷新 更改文本 以响应每秒发生一次的某个事件 由于我不想每秒绘制整个客户区域 所以我决定使用静态控件 现在的问题是父窗口被蒙皮 这意味着它有自定义位图作为背景 而静态控件没有适应 所以我正在寻找使静态控件的
  • 为什么更新外键后引用约束会不一致?

    抱歉 这个模糊的标题很难用一句话来描述 我有 2 个实体User and UserAddress 其中 User 有 2 个外键DefaultInvoiceAddressId and DefaultDeliveryAddressId和 Us
  • 如何使用 LINQ ForEach 更改 List

    我有一个List
  • OWIN AuthenticationOptions 在 mvc5 应用程序中运行时更新

    Hi 情况如下 我在 iis 7 上有一个带有 Identity 2 的 MVC 5 应用程序 该应用程序为多个网站提供服务 主机名是某些网站的关键 网站 另一个网站 等等 我决定在我的所有网站上使用谷歌外部登录 每个网站都应该是带有个人
  • 如何从 std::vector 中删除元素而不调整其大小

    迭代器擦除 迭代器位置 迭代器擦除 首先是迭代器 迭代器最后 擦除元素 从向量中删除 容器可以是单个元素 位置 或一系列元素 第一个 最后一个 这有效地减少了向量 大小除以元素数量 删除 调用每个元素的 之前的析构函数 and remove
  • 在异步方法中使用时 HttpClient 标头被清空

    我正在使用 NET Framework 4 6 1 我的 Web api 中有一个控制器 其中有静态 HttpClient 来处理所有 http 请求 在 IIS 上托管我的应用程序后 大约每月一次 我的应用程序的所有传入请求都会出现以下异
  • 外部剃刀视图看不到外部模型

    我对外部剃刀视图有疑问 在我的项目中 我有主 mvc Web 程序集和动态加载的外部类库程序集 来自 DB 及其自己的控制器 视图和模型 这些程序集在运行时不会直接引用和加载 我能够通过为控制器创建自定义控制器工厂 为视图创建自定义虚拟路径
  • 用 C# 中的字典中的值替换字符串中的单词

    我有一个简单的dictionary像这样 var fruitDictionary new Dictionary
  • 如何将 QSerialPort 模块添加到 CMake 中?

    我想将 QSerialPort 模块添加到 CMake 中 根据我的理解 我需要将QT 串口添加到 pro中 我只想使用 CMake 所以我尝试编译简单的 CMake 文件 但有错误 QtCore 正在工作 qDebug 可以毫无问题地显示
  • 第三方引用的 dll 未被复制来构建

    我有一个第三方 net dll 被我的 dll 类库项目 A 引用和使用 我的控制台应用程序项目 B 引用项目 A 我的问题是第三方 dll 没有被复制到控制台应用程序项目 B 的构建中 这里有什么问题呢 我的 dll 类库中引用的第三方
  • Excel 2007 中的数值 - 底层 xml 文件中的表示与存储

    这个问题与 NET和OpenXml有关 我已经阅读了以下文章 它有很好的解释 但没有回答我的问题 Excel 2007 中数值的可视化与底层 xml 文件不一致 https stackoverflow com questions 58594
  • 如何让 PCRE 与 C++ 一起使用?

    这是一个新手问题 但我希望我能尽可能清楚地表达我的问题 我正在尝试用 C 进行模式匹配 我已经从以下位置下载了 PCRE 的 Win32 版本here http gnuwin32 sourceforge net packages pcre
  • 如何在Windows Azure上调用ffmpeg.exe转换音频文件?

    我在 Windows Azure 上运行 Web 角色来接收 AAC 音频文件 通过 base64 字符串上传 并将它们存储到 blob 中 现在效果很好 接下来 我还必须将它们转换为 MP3 并将 MP3 存储到 blob 中 我决定使用
  • 除法时的小数舍入误差 (C#)

    我基本上有四个数字 比如 100 200 300 400 我需要计算概率为 100 100 200 300 400 200 100 200 300 400 等等在 当我使用小数数据类型来存储这些概率时 由于舍入问题 它们不会达到 1 在不使
  • 是否有理由为什么用 XmlInclude 修饰的基类在序列化时仍然会抛出类型未知的异常?

    我将简化代码以节省空间 但所提供的内容确实说明了核心问题 我有一个类 它的属性是基类型 有 3 个派生类可以分配给该属性 如果我将任何派生类分配给容器并尝试序列化容器 XmlSerializer 会抛出可怕的错误 类型 x 不是预期的 使用
  • 是否可以在 Eclipse 中为除 Java 之外的 Eclipse 编写插件?

    谁能帮我用c 写一个eclipse插件 weekens 和 celavek 感谢您提供的信息 我正在研究 JNI 并将尝试实现它 celavek 我们必须做什么样的主控 控制 在C 和java接口中处理是否风险更大 我的要求是在 Java
  • Task.Delay 到底是如何工作的?

    他们说 Task Delay 是一个异步 Thread Sleep 为了测试这一点 我写了下面的代码 我希望立即打印 One 然后 3 秒后将打印结果变量 15 2 秒后 将打印 Two 但似乎并非如此 一 不会立即打印 3 秒后打印 On
  • 64 位随机生成器种子

    我目前正在运行一个具有 8 个以上管道 线程 的多线程模拟应用程序 这些管道运行非常复杂的代码 该代码取决于种子生成的随机序列 然后该序列被归结为单个 0 1 我希望在将种子从主线程传递到处理管道后 这种 随机处理 具有 100 的确定性
  • 从不同的线程访问对象

    我有一个服务器类 它基本上等待来自客户端的连接 在该类中 我创建了一个 NetworkStream 对象 以便能够从客户端接收字节 由于 NetworkStream Read 方法不是异步的 这意味着它将等到从客户端读取字节才能继续执行类似
  • 如何从与 C# lambda 集成(而非代理集成)的 Amazon API 网关获取正确的 http 状态代码?

    我正在使用 C lambda 与 API 网关集成 我希望 API 网关返回正确的错误代码 例如 400 404 500 等 API网关模块tf文件 provider aws version lt 2 70 0 region var aws

随机推荐

  • 数据库锁定在 WAL 模式下,只有读取器

    在中使用System Data Sqlite 1 0 86 0 包括SQLite 3 7 17 预写式记录 http www sqlite org wal html模式下 我在并发读取时遇到数据库锁 如果我正确理解 WAL 则不应该出现这种
  • 为什么 BigInt(largeNumber) 仍然不精确?

    I want to find the sum of all digits of a large number for example 9995 我应用 BigInt 来获取大数的幂 并使用下面的代码将其数字相加 BigInt Math po
  • Oracle 语法 - 我们是否必须在新旧语法之间进行选择?

    我在一个由大约 8 名开发人员组成的团队中负责大约 1 000 000 行源代码的代码库 我们的代码基本上是一个使用 Oracle 数据库的应用程序 但代码随着时间的推移而不断发展 我们有大量九十年代中期的源代码 团队中就我们用于查询 Or
  • 为什么 angularjs bootstrap datepicker 选择前一天?

    我在用着AngularJS引导日期选择器指令 http angular ui github io bootstrap 当我从模型中设置日期时 它会选择所选日期之前的一天
  • MySQL - 从临时表插入

    这看起来非常简单 但我坚持使用简单的插入语句 见下文 begin work CREATE TEMPORARY TABLE IF NOT EXISTS insert table AS select r resource id fr file
  • 我怎样才能知道oracle 9i中哪些值是数字

    我有这个包含 varchar 的数据库 我想知道哪些记录保存数值 我试过REGEXP COUNT和其他 但我在 9i 上运行 我认为这是针对 10g gt 我怎样才能实现这个目标 I tried select to number my co
  • 使用 R 将我的 shapefile 数据投影到传单地图上

    我 在 Win7 上 试图获取我的 shapefile 数据 Here https www dropbox com s f3d46itleoozzjz shapefiles zip dl 0是数据文件 要使用显示leaflet包裹 但没有任
  • Google Colab 显示忙碌

    我昨天在 google colab 上进行了训练过程 现在 即使重新启动运行时并中断执行后 Google Colab仍显示繁忙 我想停止当前的执行 请帮忙 从运行时菜单中选择 重新启动运行时 就足够了 如果由于某种原因不起作用 您可以通过从
  • 随机采样数组的唯一子集

    如果我有一个数组 a 1 2 3 如何随机选择数组的子集 以使每个子集的元素都是唯一的 也就是说 对于a可能的子集是 1 2 3 1 2 2 3 1 2 3 我无法生成所有可能的子集 因为 a 的实际大小非常大 因此有很多很多子集 目前 我
  • jqGrid 将字段从文本切换为下拉列表

    我有一个 jqGrid 其中有一些列 其中 1 列是从数据库填充的下拉列表 选择 我想要的是 当我不在带有下拉列表的编辑模式列时 只需显示必须从查询中获取的文本 而当我处于编辑模式时 它应该显示下拉列表 就像这里一样 http www tr
  • 如何在 Slim Framework 3 上创建中间件?

    我阅读了文档here https www slimframework com docs concepts middleware html关于创建中间件 但我必须创建哪个文件夹或文件 文档不包含此信息 在 src 文件夹下我有middlewa
  • Bash while 循环等待任务完成

    我创建了一个 bash 脚本来处理文件夹及其子文件夹中的视频 find type f name mkv while read file do ffmpeg i file done 问题 它不是 while 循环等待 ffmpeg 完成 而是
  • 在工作表中合并行和求和值

    我有一个 Excel 工作表 其中包含以下数据 管道 来分隔列 A B C X 50 60 D E F X 40 30 A B C X 10 20 A B C Y 20 20 A B C X 20 70 D E F X 10 50 A B
  • UWP 应用程序中合并 ResourceDictionary 初始化

    在开发我的 UWP 应用程序期间 我注意到一些有趣的奇怪现象 我很难解释 我使用 MvvmLight 并决定在单独的 ResourceDictionary 中添加 ViewModelLocator 资源实例核心 xaml这将被引用自Merg
  • DIV 内的右对齐按钮

    作为一名后端开发人员 我感觉更舒服 但我有一个样式问题困扰着我 我已经发布了我的场景示例here http jsfiddle net jDaM8 1 我正在创建一个 div 它根据单击按钮显示 隐藏以显示特定项目的详细信息 该部分工作正常
  • 如何更改Android应用程序的页面?

    我是安卓新手 我已经设计了由许多页面组成的应用程序 任何人都有源代码或任何可以让我知道如何构建它的东西 例如 当我单击按钮时 我希望它将页面更改为下一页 谢谢你卡 运行通过第一个应用程序教程 https developer android
  • 如何使用字符串搜索将一种布局膨胀为另一种布局

    如何将两者都加粗xml来自带有 switch case 的搜索字符串的字符串 我想更改每个 xml 字符串textview此更改将在按钮单击时发生 String strfistsearch mylist get 7 get data4 if
  • 使用Python将文本文件导入Access 2003数据库

    我正在尝试使用我正在开发的 Python 3 4 应用程序将管道分隔的文本文件导入到具有现有表的 Access 数据库中 但遇到了一些麻烦 该应用程序将用于导入不同的文本文件 因此我使用条目小部件来写入文件名 并且我希望将输入的文件的内容加
  • 删除连接到另一表 SQL 的一个表中的记录

    我有两个表 一个包含 212 000 条记录 已弃用的记录 另一个包含 10 500 000 条记录 我想在 id 和 version number 字段上连接两个表 因为两个表都有这些字段 我希望从连接表中删除匹配的记录 来自连接表 即从
  • 在 C++ 中将函数作为参数传递

    我对 C 有点生疏 在使用 Python 一年后我要转行了 当然 我想将 python 的懒惰转化为 C 我刚刚发现了 rot13 对此我感到很兴奋 我找到了 3 种方法 并且想做一些性能测试 我还想看看修改字符串或创建新字符串是否有区别