用函数指针简化if/else switch/case

本文介绍了一种通过函数指针映射简化复杂条件分支的方法,利用枚举和静态映射表实现不同函数的调用,有效提高了代码的可读性和可维护性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

开发中常遇到一族同类型函数的处理调用情况,开始时候简单情况就使用if / else 处理,等分支情况越来越多事,代码看起来就很长且不易维护,这种时候可以考虑使用函数指针映射来简化代码。


#include <iostream>
#include <map>
using namespace std;
class A;
typedef void (A::*Call)(string);

enum MyEnum
{
	ONE = 1,
	TWO,
	THREE,
	FOUR
};

class A {
public:
	explicit A() 
	{
		sCallMap[ONE] = &A::fun1;
		sCallMap[TWO] = &A::fun2;
		sCallMap[THREE] = &A::fun3;
	}
	~A(){}

	void caller(MyEnum e, string arg)
	{
		cout << "enum " << e;
		if (sCallMap.find(e) == sCallMap.end())
		{
			cout << "	callMap no key " << e;
		}
		else
		{
			(this->*sCallMap[e])(arg);
		}
	}


private:
	void fun1(string arg) { cout  << arg.c_str(); }
	void fun2(string arg) { cout  << arg.c_str(); }
	void fun3(string arg) { cout  << arg.c_str(); }

private:
	static map<MyEnum, Call> sCallMap;
};
map<MyEnum, Call> A::sCallMap;
int main(int argc, char *argv[])
{
	A a;
	a.caller(ONE, "	call func1\n");
	a.caller(TWO, "	call func2\n");
	a.caller(THREE, "	call func3\n");
	a.caller(FOUR, "	call func4\n");
	getchar();
	return 0;
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值