【问题标题】:Using STL to bind multiple function arguments使用 STL 绑定多个函数参数
【发布时间】:2009-08-26 14:32:23
【问题描述】:

过去,我使用 bind1st 和 bind2nd 函数对 STL 容器进行直接操作。我现在有一个 MyBase 类指针容器,为了简单起见,如下所示:

X 级 { 民众: std::string getName() 常量; };

我想使用 for_each 调用以下静态函数,并像这样绑定第一个和第二个参数:

StaticFuncClass::doSomething(ptr->getName(), funcReturningString());

我将如何使用 for_each 并绑定此函数的两个参数?

我正在寻找类似的东西:

for_each(ctr.begin(), ctr.end(), bind2Args(StaticFuncClass::doSomething(), mem_fun(&X::getName), funcReturningString());

我看到 Boost 提供了它自己的绑定函数,看起来在这里很有用,但是 STL 解决方案是什么?

提前感谢您的回复。

【问题讨论】:

  • 明确一点,对于序列中的每个元素e,你想调用StaticFuncClass::doSomething(e.getName(), funcReturningString())吗?
  • 是的...从技术上讲它是 e->getName() 因为容器中的元素是指针。

标签: c++ stl


【解决方案1】:

当绑定语法变得太奇怪时,一个可靠的后备方法是定义自己的函子:

struct callDoSomething {
  void operator()(const X* x){
    StaticFuncClass::doSomething(x->getName(), funcReturningString());
  }
};

for_each(ctr.begin(), ctr.end(), callDoSomething());

这或多或少是 bind 函数在幕后所做的。

【讨论】:

  • +1 是的,我也想过这个问题。我只是想知道是否有一种内联方式可以做到这一点,例如使用 bind1st 或 bind2nd 仅绑定 2 个中的 1 个。
  • 不过,不需要构造函数。
  • 使用 STL 绑定函数可能是可能的,但它对我来说有点太麻烦了。我更喜欢函子方法。当然,在 C++0x 中,您可以使用 lambda 内联定义它
  • @xtofl:你说得对。我不确定我是否要编辑它。当我这样做时,似乎得到 CW 的速度非常快。 ;)
  • 您可以使用void callDoSomething( const X* x ) 函数使其更小。 (PS:什么是CW?)
【解决方案2】:

“STL 解决方案”是编写自己的活页夹……这就是他们创建强大的 boost::bind 的原因。

【讨论】:

    【解决方案3】:

    您可以创建一个本地仿函数结构,它可以由编译器内联(如 Jalf 所示),或者使用一个简单的函数:

    void myFunc( const X* x ) { 
        StaticFuncClass::doSomething(x->getName(), funcrReturningString() ); 
    }
    
    for_each( c.begin(), c.end(), myFunc );
    

    【讨论】:

    • & 不应该是必要的。函数可以隐式转换为函数指针,所以只需 myFunc 就可以了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-01
    • 1970-01-01
    相关资源
    最近更新 更多