使用模版处理类成员函数调用及返回值处理

类成员函数调用及返回值处理

前几天同事在处理项目中,调用某个对象的成员函数,发现每次都要先获取成员对象,然后在调用函数,这样会有大量的重复代码。

auto p = GetObject();
if(p != nullptr)
{
	p->Func();
}

采用模版

我们把所有的获取对象封装到一个模版函数里面,但是有引入新的问题,因为有的函数有返回值,而且不同的函数返回值可能不一样,还有一些函数的返回值是空。所以我们先要实现一个获取函数返回值的功能,然后对于不同的函数参数数量也不同,又要处理下多参数的问题。

// 萃取函数返回值
template <typename T... args> struct MyTriat<rType>;
template <typename rType, typename cType, typename... T>
struct MyTriat<rType (cType::*)(T...)> { using mytype = rType; }

// 类实现
class CTestA
{
public:
    void FuncA(int x, double y) {};
    int FuncB(int x) { return x; };
    CTestA* FuncC() { return this; };
};

class CTestB
{
public:
    CTestA* GetA(int keyA) { return nullptr; }
public:
    template <typename Call, typename ...T> typename MyTrait<Call>::_type callOne(int keyA, Call func, T&& ...args)
    {
        auto p = GetA(keyA);
        if (p)
        {
            return (p->*func)(std::forward<decltype(args)>(args)...);
        }
        else
        {
            return MyTrait<Call>::_type();
        }
    }
private:
    unordered_map<int, CTestA*> m_mapA;
};

// 调用
CTestB b;
b.callOne(2, &CTestA::FuncA, 1, 2.0);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值