如何用Google Mock模拟含多模板参数的std::make_shared函数?
解决GMOCK模拟带模板参数函数的编译错误
你的问题出在GMOCK的MOCK_METHOD宏解析上,预处理器会把类型中的语法符号(哪怕是模板参数里的)误当作宏参数的分隔符,导致参数计数错误。要修复这个问题,只需要把包含模板的返回类型用额外的括号包裹起来即可。
修复后的代码
#include <memory> #include <string> #include <gmock/gmock.h> #include <gtest/gtest.h> template <typename T, typename... Args> class MakeSharedMock { public: // 给返回类型加上外层括号,避免预处理器误解析 MOCK_METHOD((std::shared_ptr<T>), MakeShared, (Args... args), (const noexcept)); }; int main(){ MakeSharedMock<std::string> mock_make_shared; }
原因解释
GMOCK的MOCK_METHOD是预处理器宏,它通过逗号拆分四个核心参数:返回类型、方法名、参数列表、修饰符。当返回类型是std::shared_ptr<T>这类模板类型时,预处理器可能错误地将模板相关语法识别为宏参数分隔标记,导致宏识别的参数数量不符,触发你看到的静态断言错误。
用括号包裹返回类型后,预处理器会把整个(std::shared_ptr<T>)当作一个完整的宏参数,就能正确完成解析。这种处理方式同样适用于所有包含逗号的复杂类型(比如std::map<int, std::string>)。
关于模拟多模板参数函数
完全可以模拟带多个模板参数的函数,你只需要:
- 用类模板的参数对应原函数的模板参数(比如这里的
T和Args...对应std::make_shared<T>(Args...)的模板参数) - 确保
MOCK_METHOD的参数被预处理器正确解析(用括号包裹含模板/逗号的类型)
这样就能创建出对应不同模板参数组合的mock类实例,模拟原函数的行为。
内容的提问来源于stack exchange,提问作者FaisalM
相关产品推荐
相关产品推荐

