跟我学C++中级篇—哑元的扩展应用

一、哑元应用的扩展

在上一篇文章中对哑元进行了分析和说明,这篇文章将对哑元在C++的深入应用进行介绍和分析。哑元看似一个无用之物,但在某些特定的场景下,却可以起到一些独特的作用。所谓小特性,大作用。关键不在于功能的强大与否,而在于用在合适的场景。

二、哑元扩展应用的几个场景

哑元应用的典型场景主要有以下几种:
1、多态中的应用
多态中的应用是哑元一个较为常见情况,在多态中如果实现了一个抽象的接口类,那么就必须有一个实现这个接口类的子类才能真正验证这个接口。可有时为了只测试接口的应用就可以实现一个哑元子类来对接口进行验证。看代码:

class IDemo {
public:
    virtual void test() = 0; 
};

class Demo : public IDemo {
public:
    void test() override {
        // start worker
    }
};

class DummyDemo : public IDemo {
public:
    void test() override {
        std::cout << "Dummy demo start test...!" << std::endl;
    }
};

2、泛型编程
在上一篇的文章中,提到了哑元在元编程的应用,元编程也是泛型编程的一类。其实在哑元在泛型编程中的应用也是比较常见的。比如在模板参数中使用哑元作为默认值,在这种情况下,编译器就可以根据情况看是否使用哑元,这样让开发者的应用会更简洁灵活。


struct funcDummy {
    void operator()() const {
        // simulate
    }
};

template <typename F = funcDummy>
void callFunc(F f = Func()) {
    f();
}

int main() {
    callFunc();//call dummy

    callFunc([] { std::cout << "this is test!\n"; });//call lambada

    return 0;
}

3、测试
哑元在测试中的应用其实就是动态创建相关的哑对象,这个一般在C++的单元测试中比较常用。它的用法和前面的多态有些类似,这里就不再举例了。

三、哑元的分析

从上面的两篇文章可以看到,使用哑元如果应用到合适的场景下,会起到画龙点睛的作用。
1、哑元可以让代码的流程逻辑更合理
正如前面分析的,通过哑元控制某种具体的条件或逻辑控制让代码更清晰可用
2、让代码的测试性更加合理
通过哑元可以增强对接口和相关多态的实现的安全控制
3、增强了对业务代码的扩展性支持。
通过哑元可以实现代码的灵活、扩展的验证,这样,会让代码的实现更加清晰明确。
另外,大家可能对这种哑元与测试中Mock对象产生迷惑的行为,其实二者可以理解为同一类东西,只不过,Mock对象可能更复杂,其内部的功能实现可能更多;而一般来说,哑元相对来说要简单不少,很少有功能实现。
这样看来,哑元一般应用到没啥具体功能实现,或者说只实现某种特定的条件或逻辑的控制,因此对哑元的应用要灵活的根据实际场景进行应用。

四、总结

哑元并不是什么重要的技术点,之所以写两篇一个重要的原因在于,让大家明白简单的技术点也可以在合适的场景发挥重要的作用。开发者不能因为技术点的简单而轻视其作用,也不能过多在细节上投入工作量。正所谓,恰到好处!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值