gpt4 book ai didi

c++ - 扩展通用功能

转载 作者:行者123 更新时间:2023-11-27 22:59:56 29 4
gpt4 key购买 nike

我正在创建一个游戏,在这个游戏中,可以用多种方式 catch ,所有这些方式都会导致不同的行为。最初,我想在 catch 时向某个通用方法添加一个枚举,然后它将委托(delegate)以某种方式接住球时发生的 Action 。一个例子是:

void Weapon::Catch(Character Catcher, CatchMethod Method)
{
switch (Method)
{
case Method::PickUp: OnPickup(Catcher); break;
case Method::Pass: OnPass(Catcher); break;
// etc
}
}

这将允许我将函数调用为:

MyWeapon->Catch(Catcher, Method::Pickup);
MyWeapon->Catch(Catcher, Method::Pass);

之类的。我认为这会比

MyWeapon->CatchByPickup(Catcher);
MyWeapon->CatchByPass(Catcher);

然而,我的主要问题是,这根本不可扩展,而这正是我实际上希望通过这种通用方法实现的。如果我将方法设为枚举,则不能简单地扩展枚举并覆盖 Weapon 的派生类中的虚拟 Catch 方法。如果我决定在某个派生类中扩展该方法,我必须创建一个新的枚举,它从 Method 枚举的最后一个值开始。我不认为这是处理这种情况的正确方法,但我不知道在这种情况下最好的做法是什么。它可能涉及模板特化吗?我的主要问题是我不能简单地扩展枚举。

最佳答案

您可以使用 std::function

using CatchMethod = std::function<void(Character)>;

void Weapon::Catch(Character Catcher, CatchMethod Method)
{
Method(Catcher);
}

然后调用函数就非常简单了

// If its a regular function you can just use the pointer to the function
weapon.Catch(Player, &OnPickup);
// If its a member function you can use lambda
weapon.Catch(Player, [this](Character Catcher){OnPickup(Catcher);});
// or std::bind (slightly more verbose and less flexible)
weapon.Catch(Player, std::bind(&Weapon::OnPickup, this, std::placeholders::_1));

关于c++ - 扩展通用功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28840616/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com