【问题标题】:boost::bind with dynamic argument?boost::bind 与动态参数?
【发布时间】:2015-11-13 03:47:58
【问题描述】:

我有一个 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() 函数以接受 parent 节点作为参数,然后在其中调用 append_child(),但我不想这样做。

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

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

任何建议将不胜感激!

谢谢,

【问题讨论】:

  • 使用像 for_each 这样简单的算法,显式循环将比绑定容易得多。

标签: c++ boost lambda


【解决方案1】:

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

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

【讨论】:

  • 我应该提到的!我没有使用 C++11,所以不能使用 C++11 lambda 函数(除非使用 boost 可以实现同样的事情?)。不过,非常感谢!
  • 正如我在回答中提到的,您可以自己实现functor,并将其传递给for_eachlambda 几乎是 functor 的语法糖。
  • 感谢小天!我有很多类似的“装饰器”函数,但我实现了一个以函数指针作为参数的仿函数,它工作得很好。非常感谢!
猜你喜欢
  • 2023-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-02
  • 1970-01-01
  • 1970-01-01
  • 2012-07-16
相关资源
最近更新 更多