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

GMock中EXPECT_CALL匹配std::any参数编译报错的解决方法问询

解决方案

问题原因

std::any 标准库未提供默认的 operator== 实现,GoogleTest 默认的 TypedEq 匹配器依赖运算符比较,因此编译报错。无需修改原有接口定义,通过自定义 GoogleTest 匹配器即可解决。

方案1:自定义通用 std::any 匹配器(推荐)

先定义可复用的匹配器模板:

MATCHER_P(AnyEquals, expected_val, "") {
    // 先校验std::any存储的类型是否匹配
    if (arg.type() != typeid(expected_val)) {
        return false;
    }
    // 取出值做相等校验
    return *std::any_cast<decltype(expected_val)>(&arg) == expected_val;
}

修改你的测试代码,替换原有 TypedEq 即可:

MockUObject *mock = new MockUObject();
/// 其他业务代码
EXPECT_CALL(*mock, setProperty(
    TypedEq<const std::string&>("position"),
    AnyEquals(std::pair<double, double>(6.0, 2.0))
));

该匹配器同时支持 const std::any& 和 std::any&& 两种重载的参数校验,无需额外调整。

方案2:通过 Invoke 自定义校验逻辑

如果需要更灵活的校验逻辑,可以直接接住参数自行校验:

EXPECT_CALL(*mock, setProperty(
    TypedEq<const std::string&>("position"),
    _ // 先用通配符匹配任意第二个参数
)).WillOnce(Invoke([](const std::string& name, std::any&& value) {
    // 自行校验类型和值
    ASSERT_EQ(value.type(), typeid(std::pair<double, double>));
    auto pos = *std::any_cast<std::pair<double, double>>(&value);
    EXPECT_EQ(pos.first, 6.0);
    EXPECT_EQ(pos.second, 2.0);
}));

内容的提问来源于stack exchange,提问作者Денис Скоморощенко

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 22:39:02