C++模板类作为类指针成员(指向普通函数和类内静态函数,相当于类处理函数)和运算符重载函数以及占位符一起使用产生的参数无法匹配问题解决办法——分家!

文章讨论了如何使用C++的模板类、函数对象和占位符来实现进程函数的外部初始化。通过一个示例展示了如何创建一个进程类MyProcess,该类包含一个模板函数SetFunction,允许外部设置进程的运行函数。CFunction模板类用于包装函数,并且可以接受占位符参数,以适应不同场景的需求。当需要向进程函数传递额外参数时,通过扩展CFunctionBase类来创建具有不同参数数量的派生类,如CFunction_1和CFunction_2,从而解决了占位符匹配的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、模板类作为进程类的指针成员(指向进程运行过程函数的地址)

我们在这里定义了三个类:函数基类CFuncitonBase,模板函数类CFunction(公有继承CFuntionBase),以及进程类Myprocess。
目的是实现进程函数的外部初始化:通过Myprocess类内的SetFunction模板函数和模板函数类CFunction的构造函数相配合,在外部确定类对象的实际运行函数。调用过程如下图所示:
main函数运行机制

using namespace std;

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

class CFunctionBase {
private:
public:
    virtual ~CFunctionBase() {}
    virtual int operator()() { return 0; };
};

template<typename _FUNCTION_,typename... _ARGS_>
class CFunction:public CFunctionBase {
public:
    ~CFunction() {}
    int operator()() {return m_binder();}
	CFunction(_FUNCTION_ func, _ARGS_... args)
        :m_binder(std::forward<_FUNCTION_>(func), std::forward<_ARGS_>(args)...) {
    }
     typename std::_Bindres_helper<int, _FUNCTION_, _ARGS_...>::type m_binder;
};

class MyProcess {
private:
    CFunctionBase* m_func = nullptr;
public:
    template<typename _FUNCTION_, typename... _ARGS_>
    int SetFunction(_FUNCTION_ func, _ARGS_... args) {
        m_func = new CFunction<_FUNCTION_, _ARGS_...>(func, args...);
        return 0;
    }
    int Start() {
    	pid_t pid = fork();
        if (pid == 0) {
			(*m_func)();
            exit(0);
        }
        //注意父进程还会从这里运行下去,这个过程是异步的,相当于if(pid>0) return;   
    }

public:
    MyProcess() {}
    ~MyProcess() { m_func = nullptr; }
};

int main() {
    MyProcess process;
    process.SetFunction(sum,1,2);
    process.Start();

    return 0;
}

注意点

  1. std::bind函数的意义就像它的函数名一样,是用来绑定函数调用的某些参数的。bind的思想实际上是一种延迟计算的思想,将可调用对象保存起来,然后在需要的时候再调用。而且这种绑定是非常灵活的,不论是普通函数、函数对象、还是成员函数都可以绑定,而且其参数可以支持占位符,比如你可以这样绑定一个二元函数auto f = bind(&func, _1, _2);,调用的时候通过f(1,2)实现调用。
  2. Myprocess类内存在一个CFunctionBase* my_func指针对象(若CFunctionBase存在纯虚函数则为抽象类,
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值