【发布时间】:2020-09-04 03:15:03
【问题描述】:
请考虑以下情况。
一个假设的弹出菜单类,它显示一些动作,当其中一个被选中时,它将调用以std::function 形式传入的动作:
PopupMenu::PopupMenu(std::function<void(RowItem*)> editRowFunction, RowItem *item)
: _editRowFunction(editRowFunction)
, _item(item) {
}
然后在某些时候它可能会调用执行:
PopupMenu::execute(} {
_editRowFunction(_item);
}
然后我有另一个作为 UI 对象的类:
class EditorWidget {
void editRow(RowItem *row) {
//edit the row
}
}
这就是我如何使用它们:
int main() {
auto item = new RowItem();
auto editorWidget = new EditorWidget();
PopupMenu menu(std::bind(&EditorWidget::editRow, editorWidget, item), item);
menu.execute();
return 0;
}
一切正常。我的问题如下:
如果我已经在std::bind 中传递了参数item,为什么我必须再次将它作为第二个参数传递,以便能够使用该参数调用绑定函数?如果我不这样做,并尝试从 PopupMenu::execute() 单独调用该函数,我会收到编译器错误。
另一种方法是让PopupMenu的构造函数像这样:
PopupMenu::PopupMenu(std::function<void()> editRowFunction)
: _editRowFunction(editRowFunction) {}
如果我这样做,那么我会这样称呼它:
PopupMenu::execute() {
_editRowFunction();
}
我不喜欢这种方法的地方在于,我几乎可以在PopupMenu 构造函数中传递任何绑定函数,并且它将被调用。但这不是我想要的,我只想强制执行具有特定签名的函数。
我也可以传递一个 lambda,是的。但是让我们尝试在没有 lambda 的情况下解决它。 提前感谢大家的帮助。
【问题讨论】:
-
你研究过占位符参数吗?
-
@StephenNewell,是的,从我所见,这并没有解决我的问题。我将它绑定到一个实际的参数,所以我不需要传递一个占位符。但是,我想以占位符的形式访问该参数,但我认为它不会起作用。
-
@Scheff,是的,但我不想使用 lambda。问题是为什么不能通过
std::bind做?
标签: c++ c++11 functor std-function stdbind