我正在使用C ++ 0x的lambdas来定义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;
}
在stat boost项目的构造函数中,我希望能够做到这一点:
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定义以包含指向相关项目的指针并以这种方式获取数据,或覆盖我的使用函数。但是,如果我能以某种方式将信息暴露给lambda关于包含它的类,那将是理想的,因为我也可以在其他地方使用它
答案 0 :(得分:3)
您是否需要从lambda中访问StatBoostingItem :: StatBoostingItem范围内可用的变量?在这种情况下,您只需使用captures:
RegularUse = [&](std::set<Character::BaseCharacter*> users, std::set<Character::BaseCharacter*> targets)
[&amp;]告诉lambda通过引用捕获当前范围内的所有内容。如果您只需要一个特定的变量,您可以捕获它,您也可以使用[=]按值捕获所有内容。我猜你也可以使用[this]捕获一个指向Item实例的指针:
RegularUse = [this](std::set<Character::BaseCharacter*> users, std::set<Character::BaseCharacter*> targets)
没有尝试过,但我认为没有理由不这样做。如果它不起作用(因为this
以某种方式保留,即使lambdas不是方法),你总是可以通过将this
分配给另一个变量并捕获它来解决它:
Item* item = this;
RegularUse = [item](std::set<Character::BaseCharacter*> users, std::set<Character::BaseCharacter*> targets)
{
item.DoSomething();
}