You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 10:22:12