函数/函子作为模板参数。它们可以存储吗?

2024-01-03

想象我有以下自由函数和函子:

void myFreeFunction(void)
{
    cout << "Executing free function" << endl;
}

struct MyFunctor
{
    void operator()(void)
    {
        cout << "Executing functor" << endl;
    }
};

正如所描述的这个答案 https://stackoverflow.com/a/1174193/849083,我可以将我的函数或函子作为模板参数传递给另一个函数:

template <typename F>
void doOperation(F f)
{
    f();
}

然后调用:

doOperation(myFreeFunction);
doOperation(MyFunctor());

到目前为止,一切都很好。但如果我想要类似下面的东西怎么办:

template<typename Callback>
class MyClass
{
private:
    Callback mCallback;

public:
    MyClass(){}

    void execute()
    {
        mCallback();
    }
};

在这种情况下,我在声明类时指定函数/函子,但直到稍后才调用它。它适用于函子:

MyClass<MyFunctor> myClass1;
myClass1.execute();

但不适用于函数:

MyClass<myFreeFunction> myClass2;
myClass2.execute();

编译器说:

错误 C2923:“MyClass”:“myFreeFunction”不是参数“Callback”的有效模板类型参数

这很公平……但是你会如何构建它呢?

Note:我知道 std::function 并且最终可能会使用它。不过它的速度明显慢一些,所以我正在考虑所有的选择。

Thanks,

David


问题是 freefunction 不是类型,而是 of 的元素(在本例中是函数指针。

要解决此问题,您需要在构造中传递该函数,但是您仍然需要知道确切的类型。

myclass<call_back_t> my_class(call_back);

编辑:在 c++11 中,类型可以从decltype(call_back)

然而,获取回调可能很麻烦,创建生成器函数通常要容易得多

//this should be in the namespace of the class or a static member of it
template<FuncType>
myclass<FuncType> make_class(FuncType func)
{
     return myclass<FuncType>(func);
}
//called like
myclass mc=make_class(&my_callback);

不要为了改变构造函数

template<typename CallBack>
myclass{
private:
   CallBack call_back;
public:
   myclass(CallBack call_back_)
   : call_back(call_back_)
   {}
};

或类似的东西

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

函数/函子作为模板参数。它们可以存储吗? 的相关文章

  • 结构化绑定中缺少类型信息

    我刚刚了解了 C 中的结构化绑定 但有一件事我不喜欢 auto x y some func is that auto正在隐藏类型x and y 我得抬头看看some func的声明来了解类型x and y 或者 我可以写 T1 x T2 y
  • 在模板类中声明模板友元类时出现编译器错误

    我一直在尝试实现我自己的链表类以用于教学目的 我在迭代器声明中指定了 List 类作为友元 但它似乎无法编译 这些是我使用过的 3 个类的接口 Node h define null Node
  • 调用 McAfee 病毒扫描引擎

    我收到客户的请求 要求使用他们服务器上的 McAfee 病毒扫描将病毒扫描集成到应用程序中 我做了一些调查 发现 McScan32 dll 是主要的扫描引擎 它导出各种看起来有用的函数 我还发现提到了 McAfee Scan Engine
  • 在一个数据访问层中处理多个连接字符串

    我有一个有趣的困境 我目前有一个数据访问层 它必须与多个域一起使用 并且每个域都有多个数据库存储库 具体取决于所调用的存储过程 目前 我只需使用 SWITCH 语句来确定应用程序正在运行的计算机 并从 Web config 返回适当的连接字
  • 为什么 GCC 不允许我创建“内联静态 std::stringstream”?

    我将直接前往 MCVE include
  • 传递给函数时多维数组的指针类型是什么? [复制]

    这个问题在这里已经有答案了 我在大学课堂上学习了 C 语言和指针 除了多维数组和指针之间的相似性之外 我认为我已经很好地掌握了这个概念 我认为由于所有数组 甚至多维 都存储在连续内存中 因此您可以安全地将其转换为int 假设给定的数组是in
  • -webkit-box-shadow 与 QtWebKit 模糊?

    当时有什么方法可以实现 webkit box shadow 的工作模糊吗 看完这篇评论错误报告 https bugs webkit org show bug cgi id 23291 我认识到这仍然是一个问题 尽管错误报告被标记为RESOL
  • gcc,我可以将 offsetof() 与指向成员的模板化指针一起使用吗?

    下面的代码在这里 https ideone com XnxAyw https ideone com XnxAyw 我得到的编译器错误是 prog cpp In member function size t list base
  • 用于 FTP 的文件系统观察器

    我怎样才能实现FileSystemWatcherFTP 位置 在 C 中 这个想法是 每当 FTP 位置添加任何内容时 我都希望将其复制到我的本地计算机 任何想法都会有所帮助 这是我之前问题的后续使用 NET 进行选择性 FTP 下载 ht
  • 方程“a + bx = c + dy”的积分解

    在等式中a bx c dy 所有变量都是整数 a b c and d是已知的 我如何找到整体解决方案x and y 如果我的想法是正确的 将会有无限多个解 由最小公倍数分隔b and d 但我只需要一个解决方案 我可以计算其余的 这是一个例
  • 两个静态变量同名(两个不同的文件),并在任何其他文件中 extern 其中一个

    在一个文件中将变量声明为 static 并在另一个文件中进行 extern 声明 我认为这会在链接时出现错误 因为 extern 变量不会在任何对象中看到 因为在其他文件中声明的变量带有限定符 static 但不知何故 链接器 瑞萨 没有显
  • 两个类可以使用 C++ 互相查看吗?

    所以我有一个 A 类 我想在其中调用一些 B 类函数 所以我包括 b h 但是 在 B 类中 我想调用 A 类函数 如果我包含 a h 它最终会陷入无限循环 对吗 我能做什么呢 仅将成员函数声明放在头文件 h 中 并将成员函数定义放在实现文
  • 空指针与 int 等价

    Bjarne 在 C 编程语言 中写道 空指针与整数零不同 但 0 可以用作空指针的指针初始值设定项 这是否意味着 void voidPointer 0 int zero 0 int castPointer reinterpret cast
  • 复制目录下所有文件

    如何将一个目录中的所有内容复制到另一个目录而不循环遍历每个文件 你不能 两者都不Directory http msdn microsoft com en us library system io directory aspx nor Dir
  • 如何实例化 ODataQueryOptions

    我有一个工作 简化 ODataController用下面的方法 public class MyTypeController ODataController HttpGet EnableQuery ODataRoute myTypes pub
  • 为什么 isnormal() 说一个值是正常的,而实际上不是?

    include
  • C 函数 time() 如何处理秒的小数部分?

    The time 函数将返回自 1970 年以来的秒数 我想知道它如何对返回的秒数进行舍入 例如 对于100 4s 它会返回100还是101 有明确的定义吗 ISO C标准没有说太多 它只说time 回报 该实现对当前日历时间的最佳近似 结
  • 对于某些 PDF 文件,LoadIFilter() 返回 -2147467259

    我正在尝试使用 Adob e IFilter 搜索 PDF 文件 我的代码是用 C 编写的 我使用 p invoke 来获取 IFilter 的实例 DllImport query dll SetLastError true CharSet
  • 指针和内存范围

    我已经用 C 语言编程有一段时间了 但对 C 语言还是很陌生 有时我对 C 处理内存的方式感到困惑 考虑以下有效的 C 代码片段 const char string void where is this pointer variable l
  • Mono 应用程序在非阻塞套接字发送时冻结

    我在 debian 9 上的 mono 下运行一个服务器应用程序 大约有 1000 2000 个客户端连接 并且应用程序经常冻结 CPU 使用率达到 100 我执行 kill QUIT pid 来获取线程堆栈转储 但它总是卡在这个位置

随机推荐

  • aspnetcidev 和 aspnetvnext 之间的区别?

    两者有什么区别ASPnetcidev https www myget org gallery aspnetcidev and ASPnetvnext https www myget org gallery aspnetvnext 我看到 a
  • 获取一个文本框以仅接受 vb.net 中的字符

    我正在 Vb net 中创建一个简单的应用程序 我需要在其中执行某些验证 因此 我希望名称文本框仅接受 a z 和 A Z 中的字符 为此我编写了以下代码 Private Sub txtname KeyPress ByVal sender
  • SDL - 获取本机屏幕分辨率

    My code 窗口 cpp Window Window int w int h const char title const char icon height h width w if SDL Init SDL INIT EVERYTHI
  • 使用 OpenCV (Python) 改进轮廓检测

    我正在尝试从照片中识别卡片 我设法在理想的照片上做到了我想要的 但我现在很难在稍微不同的照明等情况下应用相同的程序 所以问题是如何使以下轮廓检测更加稳健 我需要分享我的大部分代码 以便拍摄者能够制作出感兴趣的图像 但是我的问题仅与最后一个块
  • SSIS 表达式生成器:将日期/时间转换为纪元时间戳

    我正在尝试构建一个表达式 将日期 时间参数转换为将在 Url 参数字符串中使用的纪元时间戳 我想我会尝试GetDate 首先 然后替换实际参数 Package endingDate 这个语法 DATEDIFF s 19700101 GETD
  • MediaWiki,尝试调查 VisualEditor“联系 Parsoid/RESTBase 服务器时出错 (HTTP 500)”

    很多人由于多种不同的原因而遇到相同的错误 因此 在尝试作曲家更新后 我尝试从浏览器开始调查它并逐步重建正在发生的事情 这对我来说真的很难 我非常感谢 PHP 开发人员的帮助 From Chrome Developer Tools I cou
  • 在 Android 应用程序中获取 Google 的搜索结果

    在我的 Android 应用程序中 我想从用户那里获取搜索查询 并使用该查询搜索 google 获取搜索结果并使用搜索结果填充列表 自定义搜索 API 每天的免费搜索次数限制为 100 次 那么有没有其他的搜索方法呢 这是你可以使用的东西
  • 使用普通 Javascript 隐藏所有带有类的元素

    我通常使用document getElementById id style display none 通过 Javascript 隐藏单个 div 是否有一种类似简单的方法来隐藏属于同一类的所有元素 我需要一个不使用 jQuery 的简单
  • 向同一台计算机上的多个客户端发送多播消息

    我正在尝试编写一个服务器 服务 它每秒左右在局域网上广播一条消息 有点像服务发现 该消息需要由以下人员接收 多个客户端程序可能是 在同一台机器上或不同的机器上 机器 但可能不止 每台机器上运行一个程序 同一时间 我正在使用 delphi 7
  • 使用Python提取嵌套括号中的句子

    我有多个 txt目录中的文件 这是一个示例one of my txt files kkkkk select xx xE PUT xx xxxx jdfjhf jhfjj from xxxx x xx L quit 1 xxxxx FROM
  • 有没有办法强制 mongodb 将某些索引存储在 ram 中?

    我有一个具有相对较大索引的集合 但小于可用内存 并查看该集合上 find 的性能以及 htop 给出的系统中的可用内存量 似乎 mongo 没有在内存中存储完整索引 有没有办法强制 mongo 将这个特定索引存储在内存中 查询示例 gt d
  • 如何在 SQL Server 中包含可选的空参数

    我想创建一个存储过程 它在过程的 WHERE 部分有一个可选参数 我的 C 代码可以为此过程传入 null 或有效的产品 ID 这里是 declare ProductID int set ProductID null select from
  • 等待可重入锁中的条件

    以下代码摘自Java文档的Condition http docs oracle com javase 1 5 0 docs api java util concurrent locks Condition html class Bounde
  • 我怎样才能用maven看到jboss控制台

    我用maven2启动了jboss 5 1 0 GA服务器 是否有可能我可以看到控制台中发生了什么 我正在使用 eclipse 插件来运行 Maven 是否可以在 eclipse 或其他地方看到控制台 这就是我所说的控制台的意思 是否可以在某
  • 如果响应为404,如何使用Service Worker缓存跨域资源?

    w3 6 2 跨源资源和 CORS 应用程序倾向于缓存来自 CDN 或其他来源的项目 可以直接使用请求其中许多
  • CGPDF iPhone/iPad 内存问题

    多年来 我一直在努力尝试为 iPhone iPad 制作一个可用的 PDF 阅读器 但它永远不会停止消耗内存 看来所有用CGContextDrawPDFPage绘制的页面都被内部缓存起来 永远不会释放 我不是唯一一个遇到这个问题的人 htt
  • 临时表列列表 (MySQL)

    我需要在 MySQL 中获取某些临时表 MyISAM 的列表列 例如number column name column 我需要知道具有特定名称的列数 事先 我不知道列数是多少 我正在使用动态 sql 和一些变量来创建临时表 我不能使用sho
  • 多重矩阵乘法

    在 numpy 中 我有一个 N 3x3 矩阵的数组 这是我如何存储它们的示例 我正在抽象内容 N 10 matrices np ones N 3 3 我还有一个 3 向量数组 这是一个例子 vectors np ones N 3 我似乎无
  • 失败:Microsoft.AspNetCore.SpaServices[0]

    Asp net core 2 1 Angular 6应用程序 在我的Start cs文件 我们有 app UseSpa spa gt To learn more about options for serving an Angular SP
  • 函数/函子作为模板参数。它们可以存储吗?

    想象我有以下自由函数和函子 void myFreeFunction void cout lt lt Executing free function lt lt endl struct MyFunctor void operator void