【C++】function函数对象类型的实现原理 & 偏特化函数类型 & 可变参数

#include <functional>
#include <iostream>
#include <string>

using namespace std;

/*
function 函数类型的实现原理
*/

// 通用类型模板
template <typename Fty>
class myFunction{

};

// 偏特化 R(A1) = Fty
template <typename R,typename A1>
class myFunction<R(A1)>{
public:
    // 定义一个函数指针   返回值(*函数指针名)(参数类型)
    // typedef R(*PFUNC)(A1);
    using PFUNC = R(*)(A1);
    myFunction(PFUNC pfunc):_pfunc(pfunc){}

    R operator()(A1 arg){
        return _pfunc(arg); 
    }

private:
    PFUNC _pfunc;

};


// 指定模板的函数类型   <返回值类型(参数类型)>
template <typename R,typename A1,typename A2>
class myFunction<R(A1,A2)>{
public:
    // 定义一个函数指针   返回值(*函数指针名)(参数类型)
    // typedef R(*PFUNC)(A1);
    using PFUNC = R(*)(A1,A2);
    myFunction(PFUNC pfunc):_pfunc(pfunc){}

    R operator()(A1 arg1,A2 arg2){
        return _pfunc(arg1,arg2); 
    }

private:
    PFUNC _pfunc;
    
};

void hello(string str){
    cout << str << endl;
}

int sum(int a,int b){
    cout << "a + b = " << a+b << endl;
    return a+b;
}


int main(int, char**){
    // 1. 指定函数指针类型    指向函数
    myFunction<void(string)> func1 = hello;
    // 2. 重载括号运算符 调用
    func1("hello world!"); // func1.operator()("hello ...")

    myFunction<int(int,int)> func2(sum);
    func2(1,2);
}

使用模板类的可变参数 简化

// 偏特化 R(A1) = Fty
template <typename R,typename... A>
class myFunction<R(A...)>{
public:
    // 定义一个函数指针   返回值(*函数指针名)(参数类型)
    // typedef R(*PFUNC)(A1);
    using PFUNC = R(*)(A...);
    myFunction(PFUNC pfunc):_pfunc(pfunc){}

    R operator()(A... arg){
        return _pfunc(arg...); 
    }

private:
    PFUNC _pfunc;

};

typename... A 声明一个模板类型参数包 A
A... 展开类型参数包
(A... arg) 被展开的类型包 A... 修饰的形参包 arg
arg... 展开形参包

posted @ 2025-05-01 20:41  丘狸尾  阅读(40)  评论(0)    收藏  举报