如何将每个基类封装到模板类中?
如何将每个基类封装到模板类中?
看起来你目前用多重继承组合独立mock类的思路很贴合场景——毕竟每个mock对应C API的全局函数,单例特性和独立维护的需求都很明确。如果要把每个基类(mock类)封装到模板里,核心是把单例复用逻辑抽成模板,同时保留各个mock的独立接口和组合能力,我给你一步步拆解实现:
第一步:封装通用单例模板
先写一个通用的单例模板,把所有mock都需要的单例逻辑(构造保护、实例获取、禁用拷贝移动)抽离出来,这样每个mock不用重复写这些代码:
template <typename Derived> class SingletonMock { protected: // 保护构造/析构,只允许子类继承使用 SingletonMock() = default; ~SingletonMock() = default; // 禁用拷贝和移动,确保单例唯一性 SingletonMock(const SingletonMock&) = delete; SingletonMock& operator=(const SingletonMock&) = delete; SingletonMock(SingletonMock&&) = delete; SingletonMock& operator=(SingletonMock&&) = delete; public: // 全局唯一实例获取方法 static Derived& instance() { static Derived instance; return instance; } };
第二步:改造原有mock类继承模板
把你的foo_mock、bar_mock这些类改成继承上面的SingletonMock模板,同时把构造函数设为私有,通过friend让模板类能访问:
// foo_mock.h class foo_mock : public SingletonMock<foo_mock> { // 让SingletonMock模板能访问私有构造函数 friend class SingletonMock<foo_mock>; private: foo_mock() = default; // 私有构造,确保只能通过instance()获取实例 public: // 这里放对应C API foo相关的mock方法 void mock_foo(int param) { // 你的mock逻辑实现 } // 比如添加重置mock状态的方法 void reset() { // 重置mock的调用次数、返回值等 } }; // bar_mock.h class bar_mock : public SingletonMock<bar_mock> { friend class SingletonMock<bar_mock>; private: bar_mock() = default; public: void mock_bar(const char* str) { // mock逻辑 } void reset() { // 重置逻辑 } }; // baz_mock同理,这里省略
第三步:保持原有多重继承组合方式
原来的my_test_mock还是用多重继承组合各个mock类,甚至可以给组合类加一些统一操作的辅助方法:
class my_test_mock : public foo_mock, public bar_mock, public baz_mock { public: // 统一重置所有mock的状态 void reset_all() { foo_mock::instance().reset(); bar_mock::instance().reset(); baz_mock::instance().reset(); } };
额外小贴士:处理命名冲突
如果不同mock类有同名方法(比如都叫reset),可以在组合类里用using声明明确暴露,或者调用时指定基类:
// 方式1:用using声明 class my_test_mock : public foo_mock, public bar_mock { public: using foo_mock::reset; using bar_mock::reset; }; // 方式2:调用时指定基类 my_test_mock::instance().foo_mock::reset();
这样改造后,既保留了你原来“拆分维护、统一调用”的核心逻辑,又通过模板实现了单例代码的复用,每个mock依然是对应C API全局函数的单例,完全适配你的场景。
备注:内容来源于stack exchange,提问作者Dominik Kaszewski
相关产品推荐
相关产品推荐

