c++ - 一个可以使用动态函数交换的函数

标签 c++

这听起来可能有点令人费解,但我们开始吧。

所以,我有以下代码:

  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);

LIVE DEMO

关于c++ - 一个可以使用动态函数交换的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33702740/

相关文章:

c++ - 函数指针的取消引用是如何发生的?

c++ - 指针可以是数据结构吗?

c++ - 从 C++ 应用程序在 Excel 中绘制图形

c++ - 此代码是否有效的 C++?

c++ - 与 Yeppp 一起表演!比 native 实现慢

c++ - 如何在我的dll中集成第三方库?

c++ - 将对象从一个 std::deque 移动到另一个的更好方法?

c++ - 如何在 Visual Studio 中强制输出构建错误的绝对路径

c++ - 什么时候计算右值?

c++ - 无法理解如何使用 drawText for qpainter 旋转文本