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

如何将每个基类封装到模板类中?

如何将每个基类封装到模板类中?

看起来你目前用多重继承组合独立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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.13 17:19:33