C++减少过多if判断的一种思路

有时候if判断会写很多,代码写很长

如果if判断的层次很简单,只是if-else这种结构,读起来不会觉得有多么困难,只是很长而已;麻烦的是有很多嵌套(当然这是可以优化的);

优化的好,其实并不会太影响阅读;但对于有强迫症的人,if写太多,心理就是觉得不舒服。

网上有很多利用设计模式的方法处理过多的if判断的的文章。只是要写很多类,构造函数什么的,麻烦!

利用C++中的function,pair,vector和lambda表达式

最近我也有减少if的冲动,看到一个叫“麦片说”的人在2013-11-30写的博客(http://ju.outofmemory.cn/entry/56050),采用C++11新特性,将判断和处理封装成一对函数,将这一对函数放入链表中,通过遍历链表来实现判断,确实代码量减少了,逻辑清晰了,但该文章的代码,在VS2010下编译未通过。

现将我在VS2010环境下编译通过的代码贴出,留作速查;只是在细节上做了变化,思路完全未改变。

// testProcessIfelse.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>
#include <cstdio>
#include <vector>
#include <functional>

using namespace std;
//helper function
typedef std::pair<std::function<bool(int)>
                 ,std::function<void(void)>> IfDoPair;
//指向类型为IfDoPair的对象的指针P_IfDoPair;
typedef std::shared_ptr<IfDoPair> P_IfDoPair;
typedef std::vector<P_IfDoPair> IfDoContainer;
IfDoContainer allcases;

template<typename F1, typename F2>
void add_case(F1& judgeFunc, F2& doFunc)
{
    auto ifDoPair = std::make_shared<IfDoPair>(judgeFunc,doFunc);
    allcases.push_back(ifDoPair);
}

int _tmain(int argc, _TCHAR* argv[])
{
    //add all cases
    add_case([](int nPara1){return nPara1 > 0 && nPara1<= 10;},
        [](){std::cout<<"show 1";});


    add_case([](int nPara1){return nPara1 > 11 && nPara1<= 20;},
        [](){std::cout<<"show 2";});

    //replace if-else
    int nJudgeNumber = 15;
    for(IfDoContainer::iterator it = allcases.begin(); it!=allcases.end(); it++)
    {
        if((*it)->first(nJudgeNumber))
        {
            (*it)->second();
        }
    }

    int nPause = 0;
    std::cin>>nPause;
    return 0;
}

当然具体问题还需具体研究,没有通用公式

由于要通过vector进行遍历,所以每一个判断函数的参数个数和类型应当保持一致。如果每一个判断的条件都有很大差异的话,上述方法应该作用没有那么明显。当然分离判断与处理为2个不同的函数的思路是非常有用的,以后可以举一反三。请注意,我是在VS2010下,创建控制台程序测试的,需要了解C++11的这几个新特性。

猜你喜欢

转载自blog.csdn.net/tom06/article/details/79375360