【C++基础概念理解——函数对象的本质是什么?】

概述

函数对象的基本概念参考本篇:【C++基础概念理解——什么是函数对象】
那么函数对象的本质是什么呢?

函数对象的本质是什么?

函数对象首先是个类,这个类和普通类的区别就是重载了函数操作符 operator()。除了重载函数操作符,其他私有函数照样可以定义,在类里面进行调用。那么本质就是可以像函数调用一样去调用这个类的实例而已。

函数对象一定要显式的实例化吗?

函数对象的实例化通常取决于具体的使用场景和框架的设计。在某些情况下,函数对象需要显式实例化,而在其他情况下,框架或库会自动实例化它们。

显式实例化

在某些情况下,你需要显式地实例化函数对象。例如,在手动调用函数对象时:

#include <iostream>

// 定义一个函数对象类
class MyFunctionObject {
public:
    void operator()(int x) const {
        std::cout << "Called with " << x << std::endl;
    }
};

int main() {
    MyFunctionObject funcObj; // 显式实例化函数对象
    funcObj(42); // 调用函数对象
    return 0;
}

隐式实例化

  • 隐式实例化
    在使用某些框架或库时,函数对象的实例化通常是隐式的。例如,在状态机框架中,状态转换表中指定的函数对象会在状态机运行时自动实例化和调用。

  • 示例:状态机中的函数对象
    在状态机定义中,函数对象actions::SendMsg是隐式实例化的。状态机框架会在运行时自动实例化和调用它。

  • 状态机定义

    //   status                          event                   next status               action               guard
    Row< release::WaitForResp  , state_machines::Response, release::WaitForCompleted, actions::SendMsg, state_machines::guards::CheckRequired>,
    
  • 问题:这里用的是actions::SendMsg,而不是actions::SendMsg(event, stateMachine, sourceState, targetState);为什么不带上入参?

  • 答案:在状态机框架中,动作(如actions::SendMsg)通常是以函数对象的形式定义的。这些函数对象会在状态机运行时被自动调用,并且框架会自动传递必要的参数。
    这种设计有以下几个好处:

    1. 简洁性:在状态机定义中不需要显式地传递参数,使得状态机的定义更加简洁和易读。
    2. 自动化:状态机框架会自动管理参数的传递,减少了手动调用的复杂性。
    3. 一致性:所有动作的调用方式一致,便于维护和扩展。
      也就是说,在状态机运行时,框架会自动调用SendMsgoperator(),并传递相应的参数。在状态机定义中,动作(如actions::SendMsg)通常是以函数对象的形式指定的,而不需要显式地传递参数。状态机框架会在运行时自动调用这些函数对象,并传递必要的参数。这种设计使得状态机的定义更加简洁和易读,同时减少了手动调用的复杂性。

总结

  • 显式实例化:在手动调用函数对象时,需要显式地实例化它们。
  • 隐式实例化:在使用某些框架或库时,函数对象的实例化通常是隐式的,框架会在运行时自动实例化和调用它们。
    在状态机框架中,函数对象通常是隐式实例化的,框架会在状态转换时自动处理这些实例化和调用。
  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值