类内部λ和提升函数
Class internal lambdas and boost function
我正在使用C++0x的lambda来定义boost函数。我有一些类,我使用 lambdas/boost 函数定义它们的一些行为。我想知道的是,是否可以在不更改函数定义的情况下将有关类的数据公开到 lambda 的上下文中?例如,我有一组这样的类:
class ConsumableItem : public Item
{
public:
//Constructors here
virtual bool Use(std::set<Character::BaseCharacter*> Users, std::set<Character::BaseCharacter*> Targets);
virtual bool Use(std::set<Battles::BattleCharacter> Users, std::set<Battles::BattleCharacter> Targets, Battles::BattleField &field);
protected:
bool UseRegularFunction;
boost::function<void(std::set<Character::BaseCharacter*>, std::set<Character::BaseCharacter*>)> RegularUse;
bool UseBattleFunction;
boost::function<void(std::set<Battles::BattleCharacter>, std::set<Battles::BattleCharacter>, Battles::BattleField &)> BattleUse;
};
class StatBoostingItem : public ConsumableItem
{
public:
StatBoostingItem(int UID, std::string &name, std::string &descript, boost::unordered_set<ItemFlags> Flags, boost::unordered_map<Stat, int> &boosts, int value);
protected:
virtual bool Use(std::set<Character::BaseCharacter*> Users, std::set<Character::BaseCharacter*> Targets) override;
virtual bool Use(std::set<Battles::BattleCharacter> Users, std::set<Battles::BattleCharacter> Targets, Battles::BattleField &field) override;
private:
boost::unordered_map<Stat, int> StatBoosts;
}
在统计提升项目的构造函数中,我希望能够做到这一点:
StatBoostingItem::StatBoostingItem(int UID, std::string &name, std::string &descript, boost::unordered_set<ItemFlags> Flags, boost::unordered_map<Stat, int> &boosts, int value)
: ConsumableItem(UID, name, descript, Flags, ItemClass::STAT_BOOSTING_ITEM, value)
{
StatBoosts = boosts;
RegularUse = [](std::set<Character::BaseCharacter*> users, std::set<Character::BaseCharacter*> targets)
{
for (auto character = targets.begin(); character != targets.end(); ++character)
{
for (auto statBoost = StatBoosts.begin(); statBoost != StatBoosts.end(); ++statBoost)
{
//Item Effect in here
}
}
};
}
这更像是一种好奇的事情,因为我知道我可以简单地扩展 boost::function 定义以包含指向相关项目的指针并以这种方式获取数据,或者覆盖我的 Use 函数。但是,如果我能以某种方式将有关包含它的类的信息公开到 lambda 中,那将是理想的,因为我也可以在其他地方使用它
您是否需要从 lambda 访问 StatBoostingItem::StatBoostingItem 范围内可用的变量?在这种情况下,您可以简单地使用捕获:
RegularUse = [&](std::set<Character::BaseCharacter*> users, std::set<Character::BaseCharacter*> targets)
[&] 告诉 lambda 通过引用捕获当前范围内的所有内容。如果只需要一个特定的变量,则可以只捕获它,也可以使用 [=] 按值捕获所有内容。我想你也可以使用 [this] 来捕获指向 Item 实例的指针:
RegularUse = [this](std::set<Character::BaseCharacter*> users, std::set<Character::BaseCharacter*> targets)
从来没有尝试过,但我认为没有理由它不应该工作。如果它不起作用(因为this
以某种方式保留,即使 lambda 不是方法),您始终可以通过将 this
分配给另一个变量并捕获它来解决此问题:
Item* item = this;
RegularUse = [item](std::set<Character::BaseCharacter*> users, std::set<Character::BaseCharacter*> targets)
{
item.DoSomething();
}
- 在函数内部的声明中初始化数组,并在外部使用它
- 使用C链接在函数内部创建C++模板
- 指针没有更新它在void函数内部指向的值
- SDL_PollEvent() 无法捕获类函数内部SDL_QUIT?
- 为什么从另一个构造函数内部调用C++构造函数不修改类变量?
- WriteProcessMemory 在函数内部失败
- 如何在C++中传递lambda函数内部的对象实例
- 在析构函数内部处理异常(但不抛出)
- 在函数内部传递字符 *str
- 仅在函数内部构建对象时EXC_BAD_ACCESS
- 是否可以使用类的析构函数内部函数来重置值?
- 如何在函数内部使用 zmq(以非阻塞方式)在客户端请求时获取函数的状态?
- 在函数内部错误定位后,从函数中释放返回的指针会导致芯片崩溃
- 我如何从循环内部使用迭代器的函数内部的getter中检索特定的成员
- C++ 修改函数内部的字符
- 从对象成员函数内部删除操作的技术 /设计模式
- C++14 使用捕获说明符递增 lambda 函数内部的值
- 在成员函数内部调用成员函数
- 如何在类构造函数内部对同一类的成员函数启动pthread
- Arduino C++:F()宏在函数内部有意义吗