Hippomock中重载静态函数如何使用ExpectCallFuncOverload?
解决Hippomock中ExpectCallFuncOverload处理重载静态函数的歧义问题
问题描述
现有如下C++类:
class Math { public: static int Add(int a, int b) { return a + b; } static int Add(int a, int b, int c) { return a + b + c; } };
尝试使用Hippomock的ExpectCallFuncOverload对Math::Add进行Mock时,编写了如下代码:
#include <hippomock.h> int main() { HippoMock::MockRepository mocks; mocks.ExpectCallFuncOverload(Math::Add).Return(5); Math::Add(2, 3); return 0; }
编译时gcc提示call of overloaded 'RegisterExpect_...' is ambiguous,需要明确告知Hippomock要使用哪个重载版本。
解决方法
Hippomock无法自动推导重载函数的具体版本,必须显式指定函数的类型签名消除歧义,以下是两种常用实现方式:
方式一:直接强制类型转换
将重载函数转换为目标版本的函数指针类型,明确告诉编译器要选用的重载:
#include <hippomock.h> int main() { HippoMock::MockRepository mocks; // 强制转换为双int参数的Add函数指针类型 mocks.ExpectCallFuncOverload(static_cast<int(*)(int, int)>(Math::Add)).Return(5); Math::Add(2, 3); return 0; }
方式二:使用函数类型别名(可读性更优)
先定义对应重载版本的函数类型别名,再进行转换,代码可读性更强:
#include <hippomock.h> // 定义双参数Add函数的类型别名 using AddTwoIntsFunc = int(*)(int, int); int main() { HippoMock::MockRepository mocks; mocks.ExpectCallFuncOverload(static_cast<AddTwoIntsFunc>(Math::Add)).Return(5); Math::Add(2, 3); return 0; }
如果需要Mock三参数的Add版本,只需将类型替换为int(*)(int, int, int)即可:
mocks.ExpectCallFuncOverload(static_cast<int(*)(int, int, int)>(Math::Add)).Return(10);
内容的提问来源于stack exchange,提问作者xibi
相关产品推荐
相关产品推荐

