这听起来可能有点令人费解,但我们开始吧。
所以,我有以下代码:
void Utility::validateRangeAndModify(Pet pet, int checkint,
int numbertovalidate,
bool greaterorless)
{
if (greaterorless) {
if (numbertovalidate < checkint)
pet.getAttributes()->setPetHunger(0);
} else
if (numbertovalidate > checkint)
pet.getAttributes()->func(100);
}
首先,此代码旨在验证单个整数。这部分很简单。
然后,我想让它做的是根据整数是否满足条件执行a 函数。在这种情况下,setPetHunger()
被设置为 0 或 100。问题是,我有 setPetHealth()
和 setPetEnergy()
也是。
我希望它执行的功能是我想要改变的东西。
例如。 此代码仅适用于我的宠物 Hunger。 它不会工作 因为它是健康、幸福或任何其他变量。我还有很多其他变量。
我想知道是否有任何方法可以实现这样的目标:
void Utility::validateRangeAndModify(Pet pet,
int checkint,
int numbertovalidate,
bool greaterorless,
string functiontouse)
{
if (greaterorless) {
if (numbertovalidate < checkint)
pet.getAttributes()->setPetHunger(0);
} else
if (numbertovalidate > checkint)
pet.getAttributes()->FUNCTION_TO_USE(100);
}
我可以在 C# 中为此使用反射之类的东西。但是,我不知道 c++ 中的替代函数
最佳答案
您可以通过将正确的成员函数指针作为参数传递给 Utility::validateRangeAndModify
来实现,如下所示:
void
Utility::validateRangeAndModify(Pet &pet, int checkint, int numbertovalidate,
bool greaterorless, void(Attrib::*memfun)(int)) {
^^^^^^^^^^^^^^^^^^^^^^^^^^
if(greaterorless) {
if(numbertovalidate < checkint) (pet.getAttributes()->*memfun)(0);
} else {
if(numbertovalidate < checkint) (pet.getAttributes()->*memfun)(100);
}
}
然后调用它(如果 Utility::validateRangeAndModify
不是 static
使用 obj.validateRangeAndModify
):
Utility::validateRangeAndModify(p, 10, 9, false, &Attrib::setPetHunger);
Utility::validateRangeAndModify(p, 10, 9, false, &Attrib::setPetThirst);
关于c++ - 一个可以使用动态函数交换的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33702740/