类成员函数调用及返回值处理
前几天同事在处理项目中,调用某个对象的成员函数,发现每次都要先获取成员对象,然后在调用函数,这样会有大量的重复代码。
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);