【发布时间】:2016-07-02 12:38:48
【问题描述】:
我正在制作一个程序,所有按钮都需要放在一个向量中,这样我就可以使用 for 循环轻松调用所有按钮的渲染函数。我创建了我的问题的缩短版本。所以下面的代码有一个名为 Button 的类。当我创建一个 Button 变量时,我必须发送包含我要调用的函数和模板中的函数指针的类。当我调用按钮按下功能时,它将调用我发送的功能。当我调用按钮渲染函数时,它将渲染。然后,我有两个不同的类,它们具有在按下相应按钮时应调用的函数。我以前没有使用过模板,所以如果按钮具有不同的模板参数,我不确定如何将按钮放入向量中,所以我不能写:
for (int i = 0; i < buttons.size(); i++) {
buttons[i].Render();
}
代替:
button1.Render();
button2.Render();
button3.Render();
but...
没错,代码如下:
template<class CWF> //CWF = Class with Function
class Button {
public:
typedef void(CWF::*eventMethod)();
Button(CWF& cwf_, eventMethod method_) : method(method_), cwf(cwf_) {};
~Button() {}
void Pressed() {
(cwf.*(method))();
}
void Render() {};
private:
eventMethod method;
CWF& cwf;
};
Class1 class1;
Class2 class2;
Button<Class1> button1 = Button<Class1>(class1,&Class1::MyButtonWasPressed);
Button<Class2> button2 = Button<Class2>(class2, &Class2::MyButtonWasPressed);
int main() {
// loop here
button1.Render();
button2.Render();
//
//exiting herer
string line;
getline(cin, line);
return 0;
}
【问题讨论】:
-
仅仅为了在几乎不相关的类中调用函数而使用模板参数是没有意义的。只需去掉模板参数,以便所有按钮都是同一个类,因此可以与向量一起使用,并让 Button 将 std::function
作为单击事件的回调并完成它。除非你真的需要,否则不要使用全局变量。 -
你知道学习 std::function 的好资源吗?我以前从未见过。
-
我已经解决了我的问题。非常比你。
标签: c++ function pointers vector function-pointers