c++ 拆分函数返回值和参数类型

在c++中,函数参数类型和返回值类型通常是一个比较明确的信息,好像确实无需在这个上面费周折。然而,硬编码数据类型会让代码复用性下降,如果能够通过某种方式自动获取函数参数和返回值类型,对于代码的可复用性,可读性和整洁性都有较大的提升。最近阅读GoogleTest的源码(v1.8.1)发现,它采用了模板方法实现了这一点:

// googletest/googlemock/include/gmock/internal
/gmock-generated-internal-utils.h

...
template 
struct Function;

template 
struct Function {
  typedef R Result;
  ...
};

template 
struct Function: Function {
  typedef A1 Argument1;
  ...
};

template 
struct Function: Function {
  typedef A2 Argument2;
  ...
};

template 
struct Function: Function {
  typedef A3 Argument3;
  ...
};

...

上面的代码,gmock在使用的时候是配合宏实现不同类型函数的统一。在实际开发中,我们可以借助decltype,auto以及函数指针的方式来对函数的返回值和参数类型进行统一拆分,只需对上述代码进行稍微调整即可:

template  
struct Function;

//以下以__stdcall 调用类型为例,如果函数调用类型是 __cdcel, 则需要特化新的模板组
template 
struct Function {
	typedef R RESULT;
};

template 
struct Function :Function
{
    typedef A1 ARG1;
};

template 
struct Function :Function
{
    typedef A2 ARG2;
};

template 
struct Function :Function
{
    typedef A3 ARG3;
};

//如果是函数指针类型,可以用以下模板特化组
template 
struct Function {
	typedef R RESULT;
};

template 
struct Function :Function
{
    typedef A1 ARG1;
};

template 
struct Function :Function
{
    typedef A2 ARG2;
};

template 
struct Function :Function
{
    typedef A3 ARG3;
};

// 如果有更多参数,可在此处扩展

测试代码:

int __stdcall STD_CALL_FUNC_WITH_ONE_PARAM(int b)
{
    int nn = 0;
    return nn;
}


int main(int argc, char* argv[], char* env[])
{
    //typedef int (__stdcall *Func)(int);
    using Func = decltype(&STD_CALL_FUNC_WITH_ONE_PARAM);

    Func bvn = STD_CALL_FUNC_WITH_ONE_PARAM;
    Function::RESULT result1;
    Function::ARG1 arg1;

    auto funcAutoPtr = STD_CALL_FUNC_WITH_ONE_PARAM;
    Function::RESULT result2;
    Function::ARG1 arg2;

    Function::RESULT result3;
    Function::ARG1 arg3;
    return 0;
}

你可能感兴趣的:(c++,开发语言)