函数指针当做参数传递给另外一个函数

本文通过具体的C++代码示例介绍了如何使用函数指针调用不同的数学操作,并展示了通过静态模板类实现相同功能的方法。这包括了加法、乘法及特定条件下的数值判断逻辑。
#include <stdio.h>


//比较函数
int jug(int x,int y)
{
if (x >=0)
return x;
else if (y==0)
return x;
else
return x/y;
}
//求和函数
int sub(int x, int y)
{
return (x+y);
}


//求差函数
int minus(int x,int y)
{
return (x-y);
}
//函数指针
void test(int (*p)(int ,int ),int a, int b)
{
int Int1;
Int1=(*p)(a,b);
printf("a=%d,a=%d   %d \n",a,b,Int1);




}


int main()
{
int a=1,b=2,c=3,d=4,e=-5;
test(sub,a,b);
test(minus,c,d);
test(jug,e,b);


return 0;
}








///////////////////////
也可以用静态模板类来实现


#include <iostream>
using namespace  std;




template<class T>


class  Operate
{
public:
static T Add(T a, T b)
{
return a+b;
}


static  T Mul(T a,T b)
{
return a*b;
}


static T Judge( T a, T b=1)
{
if (a >=0)
return a;
else
return a/b;
}


};


int main()
{
int A,B,C,D,E,X,Y,Z;
A=1,B=2,C=3,D=4,D=5;
X=Operate<int>::Add(A,B);
Y=Operate<int>::Mul(C,D);
Z=Operate<int>::Judge(E,B);
cout << X << endl << Y << Z <<endl;


return 0;
}
### 在 Unity 中将带有任意参数的函数作为变量传递 在 Unity 中,可以通过使用委托(Delegates)和 `System.Action` 或 `System.Func` 来实现将带有任意参数的函数作为变量传递的功能。以下是一个详细的解释和示例代码。 #### 使用委托 委托是一种类型安全的函数指针,可以引用具有相同签名的方法。通过定义一个委托类型,可以将方法作为变量传递[^1]。 ```csharp // 定义一个接受两个整数并返回整数的委托 public delegate int Operation(int a, int b); // 示例方法 public int Add(int a, int b) { return a + b; } public int Subtract(int a, int b) { return a - b; } // 使用委托调用方法 Operation operation = Add; // 将 Add 方法赋值给委托 int result = operation(5, 3); // 调用委托,等同于调用 Add 方法 operation = Subtract; // 更改委托指向 Subtract 方法 result = operation(5, 3); // 现在调用的是 Subtract 方法 ``` #### 使用 Action 和 Func Unity 支持 C# 的泛型委托 `Action` 和 `Func`,它们可以简化委托的定义过程。`Action` 用于无返回值的方法,而 `Func` 用于有返回值的方法[^2]。 ```csharp // 使用 Action 传递无返回值的方法 public void PrintMessage(string message) { Debug.Log(message); } Action<string> printAction = PrintMessage; printAction("Hello, World!"); // 使用 Func 传递有返回值的方法 public int Multiply(int a, int b) { return a * b; } Func<int, int, int> multiplyFunc = Multiply; int product = multiplyFunc(4, 3); // 结果为 12 ``` #### 动态参数支持 如果需要支持任意数量和类型的参数,可以结合 `params` 关键字或反射机制来实现[^3]。 ```csharp // 使用 params 关键字支持动态参数 public void DynamicParams(params object[] args) { foreach (var arg in args) { Debug.Log(arg.ToString()); } } Action<object[]> dynamicAction = DynamicParams; dynamicAction(new object[] { "Param1", 42, true }); ``` #### 在 Unity 中的应用场景 在 Unity 中,这种方法可以用于事件系统、按钮点击回调或其他需要动态绑定方法的场景[^4]。 ```csharp using UnityEngine; public class FunctionPassingExample : MonoBehaviour { public void OnButtonClick() { Debug.Log("Button clicked!"); } private void Start() { Button button = GetComponent<Button>(); if (button != null) { button.onClick.AddListener(OnButtonClick); // 将方法绑定到按钮点击事件 } } } ``` ### 注意事项 - 委托和 `Action/Func` 是类型安全的,确保传递的方法签名与委托定义一致。 - 如果需要支持动态参数,建议使用反射或 `params` 关键字,但需注意性能开销。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值