详细讲解C++的可调用对象

详细讲解C++的可调用对象

在C++中,存在"可调用对象(Callable Obiects)这么一个概念。准确来说,可调用对象有如下几种定义:

  • 是一个函数指针

  • 是一个具有 operator() 成员函数的类对象(仿函数)

  • 是一个可被转换为函数指针的类对象

  • 是一个类成员(函数)指针

它们在程序中的应用如下所示:

cpp 复制代码
void func(void)
{
    //...
}

struct Foo
{
    void operator() (void)
    {
        //...
    }
};

struct Bar
{
    using fr_t = void(*)(void);
    
    static void func(void)
    {
        //...
    }
    
    operator fr_t(void)
    {
        return func;
    }
};

struct A
{
    int a_;
    
    void mem_func(void)
    {
        //...
    }
};

int main(void)
{
    void(* func_ptr)(void) = &func; //1. 数指针
    func_ptr();
    
    Foo foo;    //2. 仿函数
    foo();
    
    Bar bar;    //3. 可被转换为函数指针的类对象
    bar();
    
    void (A::*mem_func_ptr)(void)      //4. 类成员函数指针
        = &A::mem_func;
    intA::*mem_obj_ptr   //或者是类成员指针
        = &A::a_;
    
    A aa;
    (aa.*mem_func_ptr)();
    aa.*mem_obj_ptr = 123;
    
    return 0;
}

从上述可以看到,除了类成员指针之外,上面定义涉及的对象均可以像一个函数那样做调用操作。

在 C++11中,像上面例子中的这些对象(func_ptr、foo、bar、mem_func_ptr、mem_obj_ptr)都被称做可调用对象。相对应的,这些

对象的类型被统称为 "可调用类型" 细心的读者可能会发现,上面对可调用类型的定义里并没有包括函数类型或者函数引用(只有函数指

针)。这是因为函数类型并不能直接用来定义对象;而函数引用从某种意义上来说,可以看做一个const 的函数指针。

C++ 中的可调用对象虽然具有比较统一的操作形式(除了类成员指针之外,都是后面加括号进行调用),但定义方法五花八门。这样在我

们试图使用统一的方式保存,或传递一个可调用对象时,会十分烦琐。

现在,C++11通过提供 std::functionstd::bind 统一了可调用对象的各种操作。

该文章会更新,欢迎大家批评指正。

推荐一个零声学院免费公开课程,个人觉得老师讲得不错,

分享给大家:Linux,Nginx,ZeroMQ,MySQL,Redis,

fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,

TCP/IP,协程,DPDK等技术内容,点击立即学习:

服务器课程:C++服务器

相关推荐
欧特克_Glodon18 分钟前
基于Qt+VTK实现的CT/MR影像浏览工具,支持体渲染及体模型剪裁
c++·qt·vtk·体渲染·裁剪
似水এ᭄往昔2 小时前
【C++】--封装红⿊树实现mymap和myset
开发语言·数据结构·c++·算法·stl
charlie1145141912 小时前
嵌入式现代C++教程:C++98——从C向C++的演化(3)
c语言·开发语言·c++·笔记·学习·嵌入式
moonquakeTT2 小时前
C++:深拷贝与浅拷贝
c++
程序员zgh2 小时前
C语言 指针用法与区别(指针常量、常量指针、指针函数、函数指针、二级指针)
c语言·开发语言·jvm·c++
冉佳驹2 小时前
C++ ——— 仿函数的使用、继承方式、赋值转换规则、菱形继承与虚继承
c++·继承·virtual·仿函数·菱形继承·模板特化·虚继承
咔咔咔的3 小时前
955. 删列造序 II
c++
xu_yule3 小时前
算法基础(数论)—欧拉函数
c++·算法·欧拉函数
xu_yule3 小时前
算法基础(数学)—数论
c++·算法·数论·最大公约数和最小公倍数·质数的判定·筛质数
Sheep Shaun3 小时前
二叉搜索树(下篇):删除、优化与应用
数据结构·c++·b树·算法