boost::绑定动态参数

boost::bind with dynamic argument?

本文关键字:参数 动态 绑定 boost      更新时间:2023-10-16

我有一个Person对象的容器。使用std::for_eachboost::bind,我试图将每一个都附加到一个XML对象(特别是类型为pugi::XML_node)。

我有一个装饰师班。它包含接受对象(例如Person类型)和pugi::xml_node的函数,然后使用对象中的数据来填充pugi::xml_node对象。

例如:

class Decorator
{
    public:
        decoratePersonNode(const Person &person, pugi::xml_node node);
        // ... many other functions
}

对于Person对象容器中的每个对象,我都希望将一个新节点附加到父节点,然后使用Person对象"装饰"该新节点。

所以我有这样的东西:

pugi::xml_node parentNode("People");
for_each(people.begin(), people.end(), boost::bind(&Decorator::decoratePersonNode, m_decorator, _1, parentNode.append_child()));

然而,这是错误的。parentNode.append_child()被调用一次,然后该对象作为每个decoratePersonNode()调用的参数传递。我希望每次迭代都调用parentNode.append_child()并将其传递给decoratePersonNode()。

我知道我可以修改decoratePersonNode()函数以接受父节点作为参数,然后在中调用append_child(),但我不想这样做。

我不想以任何方式修改decoratePersonNode()的参数:)

编辑:我也应该提到!我没有使用C++11。

任何建议都将不胜感激!

谢谢,

Ben

您可以用另一个functorlambda包装decoratPersonNode。它看起来像:

for_each(people.begin(), people.end(), 
         [&parentNode, &m_decorator](const Person& person) {
             m_decorator.decoratePersonNode(person, parentNode.append_child());
         });