过去我使用了bind1st和bind2nd函数来对STL容器进行直接操作。我现在有一个MyBase类指针的容器,为了简单起见,以下内容:
class X { public: std::string getName() const; };
我想使用for_each调用以下静态函数,并将第1和第2个参数绑定为:
StaticFuncClass :: doSomething(ptr-> getName(),funcReturningString());
我如何使用for_each并绑定此函数的两个参数?
我正在寻找以下内容:
for_each(ctr.begin(), ctr.end(), bind2Args(StaticFuncClass::doSomething(), mem_fun(&X::getName), funcReturningString());
我看到Boost提供了一个自己的绑定函数,看起来像是在这里使用的东西,但是什么是STL解决方案?
提前感谢您的回复。
答案 0 :(得分:13)
当bind-syntax变得过于奇怪时,可靠的回退是定义自己的仿函数:
struct callDoSomething {
void operator()(const X* x){
StaticFuncClass::doSomething(x->getName(), funcReturningString());
}
};
for_each(ctr.begin(), ctr.end(), callDoSomething());
这或多或少是bind
函数在幕后所做的事情。
答案 1 :(得分:4)
“STL解决方案”是编写自己的活页夹......这就是他们创建强大的boost :: bind的原因。
答案 2 :(得分:3)
您可以创建一个本地仿函数结构,可以由编译器内联(如Jalf所示),或者使用一个简单的函数:
void myFunc( const X* x ) {
StaticFuncClass::doSomething(x->getName(), funcrReturningString() );
}
for_each( c.begin(), c.end(), myFunc );