类内部lambdas和boost函数

时间:2011-05-13 04:19:02

标签: c++ lambda c++11 boost-function

我正在使用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关于包含它的类,那将是理想的,因为我也可以在其他地方使用它

1 个答案:

答案 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();
}