我正在制作一个程序,所有按钮都需要在一个 vector 中,这样我就可以使用 for 循环轻松地为所有按钮调用渲染函数。我创建了我的问题的简化版本。所以下面的代码有一个名为 Button 的类。当我创建一个 Button 变量时,我必须发送包含我想要调用的函数的类和模板中的函数指针。当我调用按钮 Pressed 函数时,它将调用我发送的函数。当我调用按钮渲染函数时,它将渲染。然后我有两个不同的类,它们具有在按下相应按钮时应调用的函数。我之前没有使用过模板,所以我不确定如果按钮具有不同的模板参数,我将如何将按钮放入 vector 中,所以我不能写:
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;
}
最佳答案
在您的示例中,最好的选择是完全删除模板,而是将 std::function
与您的回调一起传递。
但是,如果您的需求足够复杂以至于这不可行,您将需要实现某种形式的类型删除。最直观的方法是让您的模板类派生自某个提供您需要的功能的接口(interface):
class AbstractButton {
public:
virtual void Pressed() = 0;
virtual void Render() const = 0;
};
template <typename CWF>
class Button : AbstractButton {
public:
// ...
void Pressed() override { /* ... */ }
void Render() const override { /* ... */ }
};
使用:
// store in vector
std::vector<std::unique_ptr<AbstractButton>> buttons;
buttons.push_back(std::unique_ptr<AbstractButton>(new Button<Class1>(/* ... */)));
// (or std::make_unique if you have C++14)
// use:
buttons[i]->Render();
关于c++ - 如何使用具有不同模板参数的变量制作 vector ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38160241/