搜尋

首頁  >  問答  >  主體

C/C++中写一个函数,如何代替if else,switch,while等语句来实现 "不同值 对应调用 不同函数"?

功能类似如下描述:
if n==23 , 调用void fun1(void);
if n==33 , 调用void fun2(void );
if n==57 , 调用void fun3(void );
if n==246 , 调用void fun4(void );
if n==132 , 调用void fun5(void );

待实现如下函数:(5个fun函数已知,n 一定为{23,33,57,246,132}中的一个)

void Test(int n)
{
    ...
}

我想到了map<int,pFun>应该可以解决,大家还有其他方法吗?

怪我咯怪我咯2787 天前1167

全部回覆(9)我來回復

  • 迷茫

    迷茫2017-04-17 13:14:01

    讓我想到多年前寫的一個例程,思路和你的差不多,只不過沒有使用map(事實上數據量小的時候不用map性能反而好):

    #include <stdio.h>
    #include <string.h>
    
    typedef void(*VOID_FUNC_PTR)(void);
    
    typedef struct
    {
        char *pszInput;
        VOID_FUNC_PTR func;
    } FUNC_REG;
    
    void hello(void)
    {
        puts("I know you are saying hello.");
    }
    
    void hey(void)
    {
        puts("hey~hey.");
    }
    
    void someother(void)
    {
        puts("some more out put.");
    }
    
    void defaultFunc(void)
    {
        puts("there is no function for this anyway.");
    }
    
    FUNC_REG func_reg_list[] = 
    {
        "hello", hello,
        "hey", hey,
        "someother", someother
    };
    
    VOID_FUNC_PTR LookupFunc(char *pszInput)
    {
        int i;
        for (i = 0; i < sizeof(func_reg_list) / sizeof(func_reg_list[0]); i++)
        {
            if (0 == strcmp(pszInput, func_reg_list[i].pszInput))
            {
                return func_reg_list[i].func;
            }
        }
        return defaultFunc;
    }
    
    int main()
    {
        VOID_FUNC_PTR func = NULL;
        char szInput[256];
        
        while (EOF != scanf("%s", szInput))
        {
            func = LookupFunc(szInput);
            if (func != NULL)
            {
                (*func)(); 
            }
        }
        return 0;
    } 
    

    原文:http://blog.csdn.net/cashey1991/article/details/8333954

    回覆
    0
  • 大家讲道理

    大家讲道理2017-04-17 13:14:01

    想完成一個圖靈完備的結構的話,你應該使用責任鏈模式:

    class IAction
    {
    public:
        ~IAction(){}
        virtual void DoSomething(int value) = 0;
    };
    
    struct ActionFilterResult
    {
        bool runTheAction;
        bool continueFiltering;
        IAction* action;
    };
    
    class IActionFilter
    {
    public:
        ~IActionFilter(){}
        virtual ActionFilterResult Evaluate(int value) = 0;
    };
    
    vector<unique_ptr<IActionFilter>> filters;
    
    void Run(int value)
    {
        for(auto& filter : filters)
        {
            auto result = filter->Evaluate(value);
            if (result.runTheAction) result.action->DoSomething(value);
            if (!result.continueFiltering) break;
        }
    }

    回覆
    0
  • PHPz

    PHPz2017-04-17 13:14:01

    我就說一個山寨演算法吧,絕對不用if,else,while....哈哈
    (n == 23 && func1())
    || (n == 33 && fun2() )
    || (n == 57 && fun3())
    || (n == 246 && fun4())
    || (n == 132 && func5());

    利用&&和|| 的短路求值特性來實現if,else

    回覆
    0
  • 阿神

    阿神2017-04-17 13:14:01

    typedef void (*pfunc)(void);
    pfunc arrfunc[16];
    arrfunc[1]=func1;
    arrfunc[2]=func2;
    arrfunc[3]= func3;
    arrfunc[8]=func5;
    arrfunc[15]=func4;
    (arrfunc[n/16])();

    回覆
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-17 13:14:01

    我首先想到的是goto...

    回覆
    0
  • 天蓬老师

    天蓬老师2017-04-17 13:14:01

    c++11的話,可以使用function代替函式指標;

    #include <iostream>
    #include <functional>
    #include <map>
    using namespace std;
    
    void fun1()
    {
        cout << "fun1\n";
    }
    void fun2()
    {
        cout << "fun2\n";
    }
    void fun3()
    {
        cout << "fun3\n";
    }
    int main()
    {
        map<int, function<void()>> funs;
        funs[23] = fun1;
        funs[33] = fun2;
        funs[57] = fun3;
    
        funs[23]();
        
        
        return 0;
    }
    

    回覆
    0
  • PHP中文网

    PHP中文网2017-04-17 13:14:01

    雷雷

    回覆
    0
  • 黄舟

    黄舟2017-04-17 13:14:01

    雷雷

    回覆
    0
  • 大家讲道理

    大家讲道理2017-04-17 13:14:01

    幫不到大家,已刪除

    回覆
    0
  • 取消回覆