2011-05-13 66 views
0

我使用的C++ 0x的lambda表达式定义升压功能。我有一些类使用lambdas/boost函数定义它们的一些行为。我想知道的是,是否可以在不更改函数定义的情况下将关于类的数据公开到lambda的上下文中?例如,我有这样一组类:类内部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定义以包含指向有问题的项目的指针,并以这种方式获取数据,或覆盖我的使用函数。但是,如果我能以某种方式暴露信息到关于包含它的类拉姆达,这将是理想的,因为我希望能够利用它在其他地方以及

+0

这是太多样板代码为一个简单的例子。考虑剥离它至少需要代表你想要的东西。 – Xeo 2011-05-13 04:27:34

回答

3

你需要访问的范围是可用的变量StatBoostingItem :: StatBoostingItem从你的lambda?在这种情况下,你可以简单地使用captures

RegularUse = [&](std::set<Character::BaseCharacter*> users, std::set<Character::BaseCharacter*> targets)

的[&]告诉拉姆达参考捕捉一切从目前的范围。如果你只需要一个特定的变量,你可以捕获它,你也可以使用[=]来按值捕获所有东西。我猜你也可以使用[这]捕捉的指针项实例:

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(); 
} 
+0

哇..这是很容易笑,感谢 – Megatron 2011-05-13 04:32:13

+0

@ user127817要小心,一按值默认捕获('[=]')'暗示[这里]'适用。所以''=''类的成员实际上是通过引用捕获的,而不是通过值。 – 2011-05-13 08:33:29